Php 在禁止登录用户后,有选择地将其踢出

Php 在禁止登录用户后,有选择地将其踢出,php,session,cakephp,Php,Session,Cakephp,你好,StackOverflow社区: 这是一个棘手的情况。假设有20个用户登录到我的webapp,而我,管理员,(从另一台计算机和浏览器)禁止其中3个,那么我如何将我刚刚禁止的3个登录用户踢出?这似乎是一个删除会话/cookie的问题,但我如何知道要删除/使哪些会话无效以及如何访问它们 正如您所知,这个项目是在CakePHP中,我使用Memcache作为存储会话的引擎。我已经尝试过cakephp频道中讨论的一个选项,如下所示: 用户登录时,其会话id(如sd19eIVasdokja021dn

你好,StackOverflow社区:

这是一个棘手的情况。假设有20个用户登录到我的webapp,而我,管理员,(从另一台计算机和浏览器)禁止其中3个,那么我如何将我刚刚禁止的3个登录用户踢出?这似乎是一个删除会话/cookie的问题,但我如何知道要删除/使哪些会话无效以及如何访问它们

正如您所知,这个项目是在CakePHP中,我使用Memcache作为存储会话的引擎。我已经尝试过cakephp频道中讨论的一个选项,如下所示:


  • 用户登录时,其会话id(如sd19eIVasdokja021dnasd)与用户id(如db:323中的id)一起存储在memcached中。这样,用户的db记录与服务器内的会话id关联。一些代码:
    Cache::write('user\u session\u id'),$this->Auth->user('id'),$this->session->id())

  • 模型将用户的禁用列设置为1后,我将查找是否存在具有用户id的Memcache密钥,并从中检索会话id。然后删除Memcache密钥:
    
    如果($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);
    } }

  • 它不工作,用户仍在登录。我非常确定我必须销毁/作废cookies,在这种情况下,可能无法更改其他用户的cookies,对吗


  • 后续行动和解决方案:

    我能够通过以下方式解决这个问题。。。

    …还有这个(在
    用户
    模型中的一个位伪代码,实际上是从我上面的第二点演变而来的)(注意,由于下面第六行的原因,上面列出的第一点也是需要的):


    您的应用程序似乎有问题。会话/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);  
                }  
        }  
    }