2012-07-25 43 views
6

IM使用CakePHP 2.2.1和IM努力提高我与Auth Component用户认证。当用户尝试从多个位置登录时,他们会得到单独的会话ID,我想要做的是终止旧会话,以便用户无法同时从多个位置登录。CakePHP的检查会话存在于数据库

我转换了CakePHP如何使用这篇文章保存会话cakephp prevent user login from multiple locations at the same time,但没有给出如何在创建新会话时关闭旧会话的问题。

我想过建立一个会话模型,并使用该选择的记录,但林不知道如果多数民众赞成一个安全的路线一起去。

我还通过CakePHP的文档阅读的Session Component和CakeSession数据源希望有可能是一个暗示,但我不是能找到什么。

任何意见将不胜感激。

回答

6

一般情况下,要切换会话处理数据库,所以当你在不同的session_id检测到相同的用户登录就可以删除过时的会话。

的步骤,给你一个想法:

  1. 切换会话处理数据库

    Configure::write('Session.save', 'database'); 
    
  2. 创建cake_sessions

    cd app   
    Console/cake schema create Sessions 
    

    你会再看到以下内容:

    Cake Schema Shell 
    --------------------------------------------------------------- 
    
    The following table(s) will be dropped. 
    cake_sessions 
    Are you sure you want to drop the table(s)? (y/n) 
    [n] > y 
    Dropping table(s). 
    cake_sessions updated. 
    
    The following table(s) will be created. 
    cake_sessions 
    Are you sure you want to create the table(s)? (y/n) 
    [y] > y 
    Creating table(s). 
    cake_sessions updated. 
    End create. 
    
  3. 假设你在你的会话数据库由

    $this->Session->write('user_id', 123456); 
    
  4. 迭代通过data字段绑定session_iduser_id,并删除该行关闭,如果相同user_id进入您的网站,并用不同的session_id

    不幸的是,CakePHP将data存储为serialize() -ed数据。您将必须遍历cake_sessions表中的每一行,以查找包含在seralized data中的匹配user_id以进行删除。

    或者,只是为了给你一个想法,你可以使用下面的SQL为近似方法删除相关行:

    DELETE FROM `cake_sessions` WHERE `cake_sessions`.`data` LIKE '%123456%'; 
    
  5. 这样,谁都有老的session_id将老用户无法以登录用户的身份在网站上继续。

+0

所以基本上没有办法,我可以检测与CakePHPs默认SessionComponent或AuthComponent用户会话?就像我上面已经在这里会话被写入到数据库中的一个点的IM说,我只是想验证用户之前访问记录,不是肯定的,如果CakePHP的支持这还是我将不得不做手工为你指出DELETE查询。 – Dastca 2012-07-25 15:59:08

+0

您必须手动完成。 CakePHP不支持“开箱即用”功能。 – uzyn 2012-07-25 16:01:43

+0

好大,让我知道 – Dastca 2012-07-25 16:25:09

3

另一种方法是在用户表中创建一个session_id字段,并使用它在用户登录后存储用户当前会话ID。

在每一页上,如果SESSION_ID不等于当前的session_id然后删除所有会话数据,并将其重定向到登录页面,因为它必须是旧的会话数据或并发会话。

注意:在验证用户表中的会话是当前会话,重新生成会话ID时还记得更新用户表中的session_id字段,或者每次会话重新生成时,用户都将被注销。

+0

感谢我觉得Uzyns解决方案适合我的项目好一点,但我更喜欢这种解决方案。这是更清洁,更简单,无需使用“丑陋”的查询寻找与LIKE数据。谢谢 – Dastca 2012-07-26 13:20:42