Здравствуйте, сообщество StackOverflow:
Здесь сложная ситуация. Предположим, что 20 пользователей вошли в систему в моем веб-приложении, и я, администратор (с другого компьютера и браузера) забанил 3 из них, как мне тогда исключить этих 3 зарегистрированных пользователей, которых я просто забанены? Кажется, это вопрос удаления их сеансов / файлов cookie, но как мне узнать, какие сеансы удалить / сделать недействительными и как получить к ним доступ?
Как вы знаете, этот проект находится в CakePHP, и я использую Memcache в качестве движка для хранения сессий. Я уже пробовал вариант, обсуждаемый на канале cakephp, который выглядит так:
Когда пользователь входит в систему, его session_id (например, sd19eIVasdokja021dnasd) сохраняется в memcached вместе с его идентификатором пользователя (например, тот, что в db: 323). Таким образом, запись базы данных пользователя связана с его session_id на сервере. Некоторый код:
Cache::write('user_session_id_' . $this->Auth->user('id'), $this->Session->id());
После того, как модель установит для запрещенного столбца пользователя значение 1, я проверяю, существует ли ключ Memcache с идентификатором пользователя, из которого я получаю идентификатор сеанса. Затем я удаляю ключ Memcache:
if ($this->save(array('User' => array('id' => $userId, 'banned' => 1)), false)) {<br>
$userSessionId = Cache::read('user_session_id_' . $userId);<br>
if ($userSessionId !== false) {<br>
Cache::delete($userSessionId);<br>
Cache::delete('user_session_id_' . $userId);<br>
}
}
Не работает, пользователь все еще вошел в систему. Я очень уверен, что должен уничтожить / аннулировать куки, хотя, в этом случае, вероятно, нет никакого способа изменить куки других пользователей, верно?
СЛЕДОВАНИЕ И РЕШЕНИЕ:
Мне удалось решить это, следуя этому ...
Удаленно уничтожить сеанс в php (пользователь входит в систему где-то еще)?
... а также это (немного псевдокода в модели User
, который фактически развился из моей точки номер два выше) (обратите внимание, что моя точка номер один, перечисленная выше, также необходима из-за строки шесть ниже) :
foreach ($bannedUsers as $userId) {
if ($this->save(array('User' => array(
'id' => $userId,
'banned' => 1,
'ban_date' => date('Y-m-d H:i:s'))), false)) {
$userSessionId = Cache::read('user_session_id_' . $userId);
if ($userSessionId !== false) {
$Session->id($userSessionId);
$Session->write('Auth', '');
Cache::delete('user_session_id_' . $userId);
}
}
}