Принудительный logout или обновление сессии через UserAuthActionTable
Проблема/контекст
После смены пароля, блокировки пользователя или отзыва app-password нельзя «убить» чужую сессию прямым DELETE из b_user_session или изменить её: ядро хранит несколько типов авторизации (браузер, remember-me, REST с APPLICATION_ID), и рассинхрон легко оставит активный доступ.
Решение с кодом
Разлогинить пользователя везде (браузер и все приложения) — без APPLICATION_ID:
<?php
declare(strict_types=1);
use Bitrix\Main\UserAuthActionTable;
// После компрометации аккаунта или смены пароля админом
UserAuthActionTable::addLogoutAction($userId);
Отозвать только один REST-клиент (как при удалении app-password в ApplicationPasswordTable::onDelete):
<?php
declare(strict_types=1);
use Bitrix\Main\UserAuthActionTable;
// Только сессии с тем же APPLICATION_ID в Context
UserAuthActionTable::addLogoutAction($userId, 'my.module.api');
Обновить данные в сессии без выхода — например, после смены групп:
<?php
declare(strict_types=1);
use Bitrix\Main\Type\DateTime;
use Bitrix\Main\UserAuthActionTable;
// Сейчас: пересчитать права в $_SESSION
UserAuthActionTable::addUpdateAction($userId);
// Отложенно: когда наступит дата активации группы
UserAuthActionTable::addUpdateAction($userId, new DateTime('2026-06-01 00:00:00'));
- срабатывание не мгновенное: запись обрабатывается на следующем запросе пользователя (после
include.phpваш код уже не вызовет logout в том же хите); - если задан
APPLICATION_ID, браузерная сессия запись пропустит (continueпри несовпадении id); getList()в проверке кешируется на 3600 секунд — в редких случаях logout может задержаться до истечения кеша ORM-запроса;- при смене пароля самим пользователем ядро ставит
AUTH_ACTION_SKIP_LOGOUT, чтобы не выбрасывать его сразу после сохранения.
Просроченные записи чистит агент CUser::AuthActionsCleanUpAgent() (старше суток).
Итог
UserAuthActionTable — отложенная команда ядру: «на следующем хите разлогинь или обнови сессию». Для полного отзыва доступа вызывайте addLogoutAction($userId), для одного API-клиента добавляйте APPLICATION_ID и учитывайте кеш выборки при срочном отзыве.
Комментарии (0)
Пожалуйста, войдите в аккаунт, чтобы оставить комментарий
Оставить комментарийПока нет ни одного комментария. Будьте первым!
Похожие советы