Php 在禁止登录用户后,有选择地将其踢出
你好,StackOverflow社区: 这是一个棘手的情况。假设有20个用户登录到我的webapp,而我,管理员,(从另一台计算机和浏览器)禁止其中3个,那么我如何将我刚刚禁止的3个登录用户踢出?这似乎是一个删除会话/cookie的问题,但我如何知道要删除/使哪些会话无效以及如何访问它们 正如您所知,这个项目是在CakePHP中,我使用Memcache作为存储会话的引擎。我已经尝试过cakephp频道中讨论的一个选项,如下所示:Php 在禁止登录用户后,有选择地将其踢出,php,session,cakephp,Php,Session,Cakephp,你好,StackOverflow社区: 这是一个棘手的情况。假设有20个用户登录到我的webapp,而我,管理员,(从另一台计算机和浏览器)禁止其中3个,那么我如何将我刚刚禁止的3个登录用户踢出?这似乎是一个删除会话/cookie的问题,但我如何知道要删除/使哪些会话无效以及如何访问它们 正如您所知,这个项目是在CakePHP中,我使用Memcache作为存储会话的引擎。我已经尝试过cakephp频道中讨论的一个选项,如下所示: 用户登录时,其会话id(如sd19eIVasdokja021dn
Cache::write('user\u session\u id'),$this->Auth->user('id'),$this->session->id())代码>
如果($this->save(array('User'=>array('id'=>$userId,'banked'=>1)),false)){
$userSessionId=Cache::read('user\u session\u id.$userId);
如果($userSessionId!==false){
缓存::删除($userSessionId);
缓存::删除('user\u session\u id.'$userId);
}
}
后续行动和解决方案: 我能够通过以下方式解决这个问题。。。 …还有这个(在
用户
模型中的一个位伪代码,实际上是从我上面的第二点演变而来的)(注意,由于下面第六行的原因,上面列出的第一点也是需要的):
您的应用程序似乎有问题。会话/COOKIE系统的思想是,存储的会话id在向服务器发出的每个请求开始时与浏览器发送的COOKIE相匹配。如果它们不匹配,应用程序将直接退出并显示登录页面。因此,如果您能够正确删除会话id,则除非您没有在每个页面的第一行检查会话/COOKIE匹配,否则特定用户不可能不注销。用户刷新页面后是否仍登录?是。在通过应用程序的链接/菜单手动注销之前(这是一个问题,因为该应用程序处理一些金钱交易)。从memcache中删除会话不会让缓存从数据库中再次抓取会话吗?我认为您应该同时从缓存和数据库中删除。会话不存储在db中,而只存储在浏览器(即cookie)和memcache中。对不起,我把你弄糊涂了。(顺便说一句,禁令生效后不得删除用户的数据库记录)。谢谢。这很有道理。但是从上面的代码来看,Memcached会话并没有被删除。Ufff。。。我必须不断地调试,直到我发现为什么那些memcached密钥仍然存在。只是为了测试,我在登录时完全停止了memcached服务,应用程序确实把我踢了出去。但由于某些原因,我无法删除memcached会话。我编写了一些测试代码,发现cakephp的Cache::delete会破坏使用同一类(即Cache::write)设置的缓存键,但不会破坏仅属于会话的缓存键|将此答案标记为有效答案,因为尽管它没有提供确切的解决方案,但它为我指明了寻找解决方案的方向,即将用户的会话id与其数据库记录关联,这样当该记录被禁止时,我会查找会话id,设置它,然后清空它。请参阅我的原始帖子。
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);
}
}
}