Как удалить сессию пользователю ( разлогинить его )?
Система авторизации следующая:
таблица токенов:
(user_id, token, other_info..)
при успешном вводе пары логин/пароль, создаю новый токен:
1. Создаю сессию где ( user_id, Name, Last name, User photo, in_loggened - true( для проверки ) ) - для того чтобы не делать каждый раз запрос к бд
2. Пишу в куки сгенерированный token
Проверяю авторизован ли:
$_SESSION['in_loggened'] === true - все хорошо, если нет то:
если есть в куках токен, то запрашиваю всю инфу по токену и пишу в сессии все.
если нет то на страницу авторизации
В чем возникла проблема, как разлогинить другого пользователя?
я администратор, удаляю токен, но сессия остается пользователь может дальше гулять по сайту
Делать запрос к бд при каждой проверке на авторизованность накладно...
Либо к базе, либо создавай файлы с названием токена и проверяй наличие каждый раз в папке этого токена (при отсутствии файла делай session destroy)
2 вариант еще удаленно удалять сессию таким методом
session_id($old_session_id);
session_start();
session_destroy();
Логика получается такая:
смотрим куки,
если нет -> отправляем на авторизацию
если есть -> проверяем есть ли сессия - если нет -> отправляем на авторизацию
если есть -> проверяем соответствие токена кук и сессии -> если не равно -> отправляем на авторизацию
если равно -> значит пропускаем
Сашка Брамс: session_id даёт знать с какой сессией работать, поэтому сохраняйте ID каждой сессии в базу например и берите её оттуда когда надо что то с ней сделать, например уничтожить.
Вам, в любом случае, нужно проверять эквивалентность токена в базе и токена в кукисах при каждом обращении к ресурсу. При не совпадении токенов, чистим сессию и отправляем пользователя логиниться.
Сашка Брамс: Ну, да, можно не проверять.
Но, я так понял, что вы хотите разлогинивать просто изменив токен в базе?
Для этого нужна проверка на эквивалентность токенов.
Если ее не делать, то можно данные о сессии чистить на сервере, но надо знать sessionId.
при разлогине, я удаляю токен, проще уже тогда если нет токена, то чистим сессию, но не хотелось бы при каждом обращении к сайту делать запрос к бд, а то и 2
Сашка Брамс: Если вы делаете запрос к базе только в том случае, если сессии нет, то никак не получиться разлогинить пользователя, кроме как почистить данные сессии.