Быстрая заметка.
Гуглил сабж — все великие умы сообщества в каком-то диком ступоре, агонии, ужасе, не понимают как быть. Есть ещё какой-то нахер ненужный модуль. Вроде бы такой функционал из коробки не завезли до сих пор.
Ситуация: в битриксе работает агент, который периодически блокирует пользователей по определённым критериям.
Задача: заблокированные пользователи, если они были авторизованы в момент блокировки, должны быть сразу разлогинены.
Решение: проверять флаг активности текущего пользователя и перенаправлять на адрес логаута в публичной части.
Описание:
Во-первых. Чтобы ты понимал как блокируется пользователь в контексте этой задачи, то всё сводится к элементарщине:
$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'); } }
Примечания:
- Не добавляй этот код в init.php. Простой копипаст в этот файл ломает весь битрикс вместе с админкой.
- Для логаута можно использовать три подхода:
- $USER->Logout()
Технически юзера выкинет сразу, но страница генерируется с момента, когда он ещё был авторизован. Поэтому когда она откроется, он ещё будет уверен, что авторизован — страница содержит все признаки. И если на странице есть ссылки на какие-то функции, доступные только авторизованным, то может произойти что угодно — и хорошо, если это просто ошибка доступа. - Переброс на главную страницу /index.php?logout=yes
В этом случае юзер попадёт не туда, куда хотел (не по ссылке). Это введёт его в заблуждение и ступор. (Ну да, а сам факт внезапного разлогина не введёт?) - Переброс на текущую страницу с параметром ?logout=yes
Самый клёвый вариант, потому что человек перейдёт на нужную страницу уже разлогиненным, ведь обработка GET-параметра logout проиходит раньше вывода страницы. Поэтому если страница назначения окажется доступной только для авторизованных, то вылетевший только что юзер получит ошибку или редирект — смотря как устроен код твоего проекта.
Опционально можешь написать в шапке сайта в этот момент какое-нибудь сообщение, чтобы он был в курсе.
Но возможен бесконечный редирект страницы на саму себя — используй этот подход с осторожностью и обязательно проверяй $USER->IsAuthorized()
- $USER->Logout()