Главная » API Битрикс » CUser » CUser::Logout и завершение сессии в Битрикс

CUser::Logout и завершение сессии в Битрикс

Схема завершения сессии пользователя через CUser::Logout в 1С-Битрикс

Завершение сессии пользователя выглядит как простая операция, но имеет несколько нюансов — от разницы между выходом текущего пользователя и принудительным завершением чужой сессии до того, что реально происходит с данными при вызове. Разберём CUser::Logout.

Базовый вызов для текущего пользователя

<?php

global $USER;

$USER->Logout();

LocalRedirect('/');

Logout() завершает сессию текущего авторизованного пользователя — удаляет данные авторизации из сессии и очищает связанные cookie. После вызова явный редирект обычно необходим, поскольку сам метод не перенаправляет пользователя автоматически — без редиректа выполнение скрипта продолжится с уже вышедшим из системы пользователем на той же странице.

Что происходит с данными корзины при выходе

Содержимое корзины, привязанной к авторизованному пользователю, не исчезает при выходе — она сохраняется в связи с учётной записью и восстанавливается при повторном входе. Анонимная корзина (для неавторизованного посетителя, привязанная к сессии через cookie) — отдельная сущность, которая не переносится автоматически в корзину пользователя просто по факту выхода и повторного входа, если явно не реализована логика их слияния.

Нужна помощь с Битрикс?





    Принудительное завершение сессии другого пользователя

    Штатный API не предоставляет прямого метода "принудительно разлогинить конкретного пользователя" удалённо, поскольку сессии хранятся раздельно на стороне каждого клиента, — для реализации такой функциональности (например, при подозрении на компрометацию учётной записи) нужен собственный механизм: хранение версии или метки времени последней принудительной инвалидации сессий пользователя в базе, проверяемое при каждом запросе, и отклонение запроса, если метка активной сессии оказывается старше метки инвалидации.

    <?php
    
    // проверка в обработчике OnPageStart или подобном
    
    global $USER;
    
    if ($USER->IsAuthorized()) {
        $forcedLogoutAt = CUserOptions::GetOption('security', 'force_logout_at', false, $USER->GetID());
        $sessionStartedAt = $_SESSION['SESSION_STARTED_AT'] ?? 0;
    
        if ($forcedLogoutAt && $sessionStartedAt < $forcedLogoutAt) {
            $USER->Logout();
        }
    }

    Автоматический выход по таймауту неактивности

    Для проектов с повышенными требованиями к безопасности (например, административный интерфейс с чувствительными данными) может потребоваться автоматическое завершение сессии после периода неактивности — штатное время жизни сессии определяется настройками главного модуля, но для более тонкого контроля именно по неактивности (а не по абсолютному времени с момента входа) нужна собственная проверка метки последней активности при каждом запросе.

    Выход из всех устройств сразу

    Штатный механизм авторизации Битрикса не разделяет отдельные сессии одного пользователя на разных устройствах как независимые сущности с индивидуальным управлением по умолчанию — реализация функции "выйти со всех устройств", распространённой в современных сервисах, также требует собственного механизма версионирования сессий, аналогичного принудительному завершению сессии, описанному выше.

    Очистка данных сессии сверх стандартной авторизации

    <?php
    
    global $USER;
    
    // собственные данные, положенные в сессию помимо штатной авторизации
    unset($_SESSION['CUSTOM_WIZARD_STEP']);
    unset($_SESSION['CUSTOM_CART_DRAFT']);
    
    $USER->Logout();

    Если проект хранит в сессии собственные временные данные помимо штатной авторизации, стоит явно очищать их при выходе, если это релевантно логике проекта, — Logout() берёт на себя только данные, связанные непосредственно с авторизацией, а не произвольные данные сессии, добавленные проектным кодом.

    Частые ошибки

    • Отсутствует явный редирект после вызова Logout. Выполнение скрипта продолжается на той же странице с уже неавторизованным пользователем.
    • Ожидание, что Logout завершит сессию на других устройствах. Метод затрагивает только текущую сессию, не все активные сессии пользователя.
    • Собственные данные сессии не очищаются при выходе. Остаются висеть после Logout, если это не предусмотрено явно.

    Итог

    CUser::Logout завершает сессию текущего пользователя, но не предоставляет встроенного механизма для принудительного завершения чужой сессии удалённо или выхода со всех устройств сразу — обе эти возможности, востребованные в проектах с повышенными требованиями к безопасности, требуют собственной реализации через версионирование или метки времени инвалидации сессий в базе данных.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    Инструменты
    База знаний