Выборочно выгружать вошедших в систему пользователей после их запрета - PullRequest
3 голосов
/ 01 июня 2011

Здравствуйте, сообщество StackOverflow:

Здесь сложная ситуация. Предположим, что 20 пользователей вошли в систему в моем веб-приложении, и я, администратор (с другого компьютера и браузера) забанил 3 из них, как мне тогда исключить этих 3 зарегистрированных пользователей, которых я просто забанены? Кажется, это вопрос удаления их сеансов / файлов cookie, но как мне узнать, какие сеансы удалить / сделать недействительными и как получить к ним доступ?

Как вы знаете, этот проект находится в CakePHP, и я использую Memcache в качестве движка для хранения сессий. Я уже пробовал вариант, обсуждаемый на канале cakephp, который выглядит так:


  1. Когда пользователь входит в систему, его session_id (например, sd19eIVasdokja021dnasd) сохраняется в memcached вместе с его идентификатором пользователя (например, тот, что в db: 323). Таким образом, запись базы данных пользователя связана с его session_id на сервере. Некоторый код: Cache::write('user_session_id_' . $this->Auth->user('id'), $this->Session->id());

  2. После того, как модель установит для запрещенного столбца пользователя значение 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> } }

  3. Не работает, пользователь все еще вошел в систему. Я очень уверен, что должен уничтожить / аннулировать куки, хотя, в этом случае, вероятно, нет никакого способа изменить куки других пользователей, верно?


СЛЕДОВАНИЕ И РЕШЕНИЕ:

Мне удалось решить это, следуя этому ... Удаленно уничтожить сеанс в 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);  
            }  
    }  
}  

1 Ответ

1 голос
/ 01 июня 2011

Вы, кажется, делаете что-то не так с вашим приложением.Идея системы SESSION / COOKIE заключается в том, что сохраненный идентификатор SESSION сопоставляется в начале каждого запроса, отправляемого на сервер, с COOKIE, который отправляет браузер.Если они не совпадают, приложение просто закрывается и показывает страницу входа.Таким образом, если вы в состоянии правильно удалить идентификатор SESSION, нет никакого способа, чтобы конкретный пользователь не вышел из системы, если только вы не проверяете совпадение SESSION / COOKIE, которое вы должны выполнять в первой строке каждой страницы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...