Быстрая заметка.
Гуглил сабж — все великие умы сообщества в каком-то диком ступоре, агонии, ужасе, не понимают как быть. Есть ещё какой-то нахер ненужный модуль. Вроде бы такой функционал из коробки не завезли до сих пор.
Ситуация: в битриксе работает агент, который периодически блокирует пользователей по определённым критериям.
Задача: заблокированные пользователи, если они были авторизованы в момент блокировки, должны быть сразу разлогинены.
Решение: проверять флаг активности текущего пользователя и перенаправлять на адрес логаута в публичной части.
Описание:
Во-первых. Чтобы ты понимал как блокируется пользователь в контексте этой задачи, то всё сводится к элементарщине:
$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()
Добавить комментарий