- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
你好 StackOverflow 社区:
这是一个棘手的情况。假设有 20 个用户登录到我的 webapp,而我,管理员,(从不同的计算机和浏览器)禁止了其中的 3 个,那么我如何踢出这 3 个登录用户我刚禁了?这似乎是删除他们的 session /cookie 的问题,但我如何知道要删除/使哪些 session 无效以及如何访问它们?
如你所知,这个项目在 CakePHP 中,我使用 Memcache 作为存储 session 的引擎。我已经尝试过在 cakephp channel 中讨论过的一个选项,它是这样的:
当用户登录时,他的 session_id(例如 sd19eIVasdokja021dnasd)与他的用户 ID(例如 db 中的那个:323)一起存储在 memcached 中。这样,用户的数据库记录与他在服务器中的 session_id 相关联。一些代码: Cache::write('user_session_id_' . $this->Auth->user('id'), $this->Session->id());
模型将用户的禁止列设置为 1 后,我查找是否存在具有用户 ID 的 Memcache 键,并从中检索 session ID。然后我删除 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/>
}
}
它不起作用,用户仍处于登录状态。不过,我非常确定我必须销毁/使 cookie 无效,在这种情况下可能无法更改其他用户的 cookie,对吗?
跟进和解决方案:
我能够通过遵循这个来解决这个问题...... Remotely destroy a session in php (user logs in somewhere else)?
...还有这个(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);
}
}
}
最佳答案
您的应用似乎有问题。 SESSION/COOKIE 系统的想法是存储的 SESSION id 在每个向服务器发出的请求的开头与浏览器发送的 COOKIE 相匹配。如果它们不匹配,应用程序将直接退出并显示登录页面。因此,如果您能够正确删除 SESSION id,则特定用户不可能不注销,除非您没有在每一页的第一行检查 SESSION/COOKIE 匹配.
关于php - 禁止后有选择地踢出登录用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6193916/
我是一名优秀的程序员,十分优秀!