PHP
#bitrix#php#permissions#access#redirect#security#user-groups

Проверка прав доступа и редирект пользователя

Быстрая проверка групп пользователя и редирект с примерами для разных сценариев доступа.

Как использовать

  1. Вызовите checkAccessAndRedirect() в начале страницы или в component_epilog/prolog до вывода контента.
  2. Передайте массив ID разрешённых групп (или один код/ID) и URL редиректа при отсутствии доступа.
  3. Для неавторизованных выполнится редирект сразу; для авторизованных — проверка по группам.

Ограничение доступа к страницам и разделам по группам пользователя в 1С-Битрикс делают через проверку $USER->GetUserGroupArray() и при отсутствии нужной группы — редирект на страницу входа или «Доступ запрещён». Проблема: проверку забывают вынести в одно место, редирект срабатывает после вывода части HTML, либо проверяют по коду группы неверно. Симптомы: неавторизованный пользователь видит контент, либо авторизованный с другой группой попадает на страницу или получает пустую страницу без редиректа. Ниже — единая функция проверки по ID или коду групп с редиректом через LocalRedirect(), примеры вызова и проверка результата.

Решение

Проверка прав доступа через группы пользователя и редирект при отсутствии доступа. Используйте для защиты страниц и разделов сайта.

use Bitrix\Main\Application;

/**
 * Проверка прав и редирект
 * @param array|string $allowedGroups ID групп или код группы (например, [1, 2] или 'ADMIN')
 * @param string $redirectUrl Куда редиректить при отсутствии доступа
 * @return bool true если доступ есть
 */
function checkAccessAndRedirect($allowedGroups, $redirectUrl = '/') {
    global $USER;
    
    if (!$USER->IsAuthorized()) {
        LocalRedirect($redirectUrl);
        return false;
    }
    
    $userGroups = $USER->GetUserGroupArray();
    $allowed = is_array($allowedGroups) ? $allowedGroups : [$allowedGroups];
    
    // Проверяем по ID групп
    $hasAccess = !empty(array_intersect($userGroups, $allowed));
    
    // Если не по ID, проверяем по коду группы
    if (!$hasAccess) {
        $groupCodes = [];
        foreach ($allowed as $groupId) {
            $group = CGroup::GetByID($groupId)->Fetch();
            if ($group) {
                $groupCodes[] = $group['STRING_ID'] ?: $group['ID'];
            }
        }
        $hasAccess = !empty(array_intersect($userGroups, array_map('intval', $groupCodes)));
    }
    
    if (!$hasAccess) {
        LocalRedirect($redirectUrl);
        return false;
    }
    
    return true;
}

// Примеры использования:

// 1. Только для авторизованных администраторов (группа ID=1)
checkAccessAndRedirect([1], '/auth/');

// 2. Для нескольких групп
checkAccessAndRedirect([1, 5, 7], '/access-denied/');

// 3. В компоненте или странице
if (!checkAccessAndRedirect([1], '/')) {
    return; // Редирект уже выполнен
}

// 4. С кастомным сообщением через сессию
if (!checkAccessAndRedirect([1], '/')) {
    $_SESSION['ACCESS_DENIED_MESSAGE'] = 'Доступ запрещён';
    return;
}

Вызывайте функцию в начале страницы или компонента. Если доступ отсутствует, выполнится редирект. LocalRedirect() завершает выполнение скрипта. Для AJAX используйте JSON-ответ вместо редиректа. Группа с ID=1 — администраторы по умолчанию в Bitrix.

Проверка

  1. Неавторизованный пользователь — откройте защищённую страницу в режиме инкогнито или выйдите из аккаунта. Ожидаем редирект на указанный URL (например /auth/ или /).

  2. Авторизованный пользователь без нужной группы — залогиньтесь под пользователем, который не входит в указанные группы (например не админ). Должен сработать редирект на $redirectUrl.

  3. Авторизованный пользователь с нужной группой — залогиньтесь под учётной записью из разрешённой группы (например ID=1). Страница должна открыться без редиректа.

  4. Диагностика групп текущего пользователя (временно в коде страницы):

global $USER;
if ($USER->IsAuthorized()) {
    $groups = $USER->GetUserGroupArray();
    var_dump($groups); // массив ID групп
}

Сверьте ID с теми, что передаёте в checkAccessAndRedirect().

Типичные ошибки

  • Редирект не срабатывает, выводится контент — функция вызвана после вывода HTML или внутри компонента, который уже что-то отрисовал. Вызывайте проверку в самом начале страницы или в component_epilog/prolog до любого вывода.
  • «Headers already sent» при редиректе — до LocalRedirect() был вывод (echo, пробелы до <?php). Уберите любой вывод до вызова проверки или используйте CHTTP::SetStatus("302 Found"); и header("Location: ..."); до вывода (при необходимости).
  • AJAX-запрос редиректит вместо JSON — для API/AJAX не используйте редирект; возвращайте JSON с кодом 403 и сообщением, иначе клиент получит HTML страницы редиректа.
  • Проверка по коду группы (STRING_ID) — в примере выше разрешённые группы задаются массивом ID. Если нужно проверять по строковому коду (например «ADMIN»), реализуйте отдельную ветку: получить ID группы по коду через CGroup::GetList и сверять с GetUserGroupArray().

Где применять

  • Prod / dev: личный кабинет, разделы только для определённых групп (менеджеры, партнёры), админ-страницы вне стандартной авторизации Bitrix.
  • Компоненты: вызов в component_epilog или в шаблоне в начале; при использовании в прологе компонента — до вывода разметки.

Связанные сниппеты: Проверка CSRF и прав в обработчике, Проверка в component prolog, Безопасный AJAX endpoint в Bitrix.