Битрикс: как разлогинить любого заблокированного пользователя. 100% рабочий метод.

Этот пост был опубликован мной более года назад. Информация, описанная ниже, уже могла потерять актуальность, но всё ещё может быть полезна.

Быстрая заметка.

Гуглил сабж — все великие умы сообщества в каком-то диком ступоре, агонии, ужасе, не понимают как быть. Есть ещё какой-то нахер ненужный модуль. Вроде бы такой функционал из коробки не завезли до сих пор.

Ситуация: в битриксе работает агент, который периодически блокирует пользователей по определённым критериям.

Задача: заблокированные пользователи, если они были авторизованы в момент блокировки, должны быть сразу разлогинены.

Решение: проверять флаг активности текущего пользователя и перенаправлять на адрес логаута в публичной части.

Описание:

Во-первых. Чтобы ты понимал как блокируется пользователь в контексте этой задачи, то всё сводится к элементарщине:

$tmpUser = new CUser;
$tmpUser->Update($user_id, [
    "ACTIVE" => "N",
    "ADMIN_NOTES" => "Автоблокировка",
]);

Чтобы пользователя, только что заблокированного и сидящего сейчас на сайте, выкинуло из учётки, нужно в /bitrix/header.php (или любое другое место публичной части, которое подгружается на любой странице) вставить следующий код:

// логаут ставшего неактивным текущего пользователя
if ($USER->IsAuthorized()) { // проверка на авторизованость
    // объект $USER не содержит нужной инфы, придётся брать из БД
    $arFilter = ["ID" => $USER->GetID()];
    $dbUserList = CUser::GetList($by = "id", $order = "asc", $arFilter);
    // проверка флага активности
    if ($dbUserList->Fetch()['ACTIVE'] == 'N') {
        // смотри примечания ниже
        // $USER->Logout();
        // LocalRedirect('/index.php?logout=yes');
        LocalRedirect($_SERVER['SCRIPT_URI'].'?logout=yes');
    }
}

Примечания:

  1. Не добавляй этот код в init.php. Простой копипаст в этот файл ломает весь битрикс вместе с админкой.
  2. Для логаута можно использовать три подхода:
    1. $USER->Logout()
      Технически юзера выкинет сразу, но страница генерируется с момента, когда он ещё был авторизован. Поэтому когда она откроется, он ещё будет уверен, что авторизован — страница содержит все признаки. И если на странице есть ссылки на какие-то функции, доступные только авторизованным, то может произойти что угодно — и хорошо, если это просто ошибка доступа.
    2. Переброс на главную страницу /index.php?logout=yes
      В этом случае юзер попадёт не туда, куда хотел (не по ссылке). Это введёт его в заблуждение и ступор. (Ну да, а сам факт внезапного разлогина не введёт?)
    3. Переброс на текущую страницу с параметром ?logout=yes
      Самый клёвый вариант, потому что человек перейдёт на нужную страницу уже разлогиненным, ведь обработка GET-параметра logout проиходит раньше вывода страницы. Поэтому если страница назначения окажется доступной только для авторизованных, то вылетевший только что юзер получит ошибку или редирект — смотря как устроен код твоего проекта.
      Опционально можешь написать в шапке сайта в этот момент какое-нибудь сообщение, чтобы он был в курсе.
      Но возможен бесконечный редирект страницы на саму себя — используй этот подход с осторожностью и обязательно проверяй $USER->IsAuthorized()

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *