В процессе создания кастомного функционала, пришлось хранить некоторые данные, зависящие от конкретного пользователя, в сессии.
Во время тестирования функционала на одной машине из-под разных пользователей, выяснилось, что эти установленные сессионные данные не уничтожаются при разлогинивании пользователя, а остаются в сессии. Из-за этого следующий залогиненный пользователь видит то, что ему видеть не разрешается.
В целом, данная ситуация не сильно повлияет на большинство пользователей ресурса, так как у них обычно один аккаунт и вероятность использования второго крайне мала. Тем не менее, надо сделать все правильно и убрать даже малейшую возможность того, что что-то пойдет не так. Для этого нам потребуется очищать сессионные данные в момент когда пользователь разлогинивается.
Для начала изучим код
метода, разлогинивающего пользователя.
Как видно, в методе Битрикс уничтожает только собой же установленный массив данных
SESS_AUTH
и еще несколько ключей.
Остальные данные остаются в сессии и умирают спустя некоторое время после закрытия браузера.
Значит, требуется удалить эти данные самостоятельно.
В коде того же метода видим, что в ходе его работы возникают несколько событий, на которые можно повесить обработчик.
Выбираем, к примеру, событие
OnAfterUserLogout и вешаем на него собственный обработчик, в котором удаляем сессионные данные. Например, так:
// Регистрация обработчика
AddEventHandler(
'main',
'OnAfterUserLogout',
['Some\Namespace\Here\EventHandlers', 'deleteSessionData']
);
// Собственно обработчик
public function deleteSessionData()
{
unset($_SESSION['CUSTOM_SESSION_KEY']);
// Явно вернем true чтобы не испытывать проблем с трактовкой результата
return true;
}
После этого можно спать спокойно.
P.S. Как вариант, можно добавлять свои данные в ключ
SESS_AUTH
и тогда событие не понадобится совсем. Однако, в этом случае следует быть внимательным в выборе названия ключей, чтобы ваши данные не затерли битриксовые или наоборот.