Проверка прав доступа и редирект пользователя
Быстрая проверка групп пользователя и редирект с примерами для разных сценариев доступа.
Как использовать
- Вызовите checkAccessAndRedirect() в начале страницы или в component_epilog/prolog до вывода контента.
- Передайте массив ID разрешённых групп (или один код/ID) и URL редиректа при отсутствии доступа.
- Для неавторизованных выполнится редирект сразу; для авторизованных — проверка по группам.
Ограничение доступа к страницам и разделам по группам пользователя в 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.
Проверка
-
Неавторизованный пользователь — откройте защищённую страницу в режиме инкогнито или выйдите из аккаунта. Ожидаем редирект на указанный URL (например
/auth/или/). -
Авторизованный пользователь без нужной группы — залогиньтесь под пользователем, который не входит в указанные группы (например не админ). Должен сработать редирект на
$redirectUrl. -
Авторизованный пользователь с нужной группой — залогиньтесь под учётной записью из разрешённой группы (например ID=1). Страница должна открыться без редиректа.
-
Диагностика групп текущего пользователя (временно в коде страницы):
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.