【问题标题】:CakePHP Check Session exists in databaseCakePHP 检查会话存在于数据库中
【发布时间】:2012-07-25 14:51:01
【问题描述】:

我正在使用CakePHP 2.2.1 并尝试使用Auth Component 改进我的用户身份验证。当用户尝试从多个位置登录时,他们会获得单独的会话 ID,我想要做的是终止旧会话,这样用户就无法同时从多个位置登录。

我使用这篇帖子 cakephp prevent user login from multiple locations at the same time 转换了 CakePHP 如何保存其会话,但没有给出关于如何在创建新会话时终止旧会话的答案。

我考虑过创建一个会话模型并使用它来选择记录,但我不确定这是否是一条安全的路线。

我还阅读了 Session Component 和 CakeSession 数据源上的 CakePHP 文档,希望可能有提示,但我找不到任何东西。

任何建议将不胜感激。

【问题讨论】:

    标签: cakephp authentication login


    【解决方案1】:

    通常,您希望将会话处理切换到数据库,以便在检测到同一用户使用不同的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. 假设您通过

      将session_id绑定到user_id
      $this->Session->write('user_id', 123456);
      
    4. 遍历会话数据库中的data 字段,如果相同的user_id 进入您的站点并且使用不同的session_id,则删除该行。

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

      或者,只是为了给您一个想法,您可以使用以下 SQL 的 近似 方法来删​​除关联的行:

      DELETE FROM `cake_sessions` WHERE `cake_sessions`.`data` LIKE '%123456%';
      
    5. 这样,拥有旧 session_id 的旧用户将无法以登录用户身份继续访问网站。

    【讨论】:

    • 所以基本上我无法检测到带有 CakePHPs 默认 SessionComponent 或 AuthComponent 的用户会话?就像我在上面所说的那样,我已经在将会话写入数据库的时候,我只是在验证用户之前尝试访问记录,并且不确定 CakePHP 是否支持这一点,或者我是否必须按照你指出的那样手动执行DELETE 查询。
    • 您必须手动完成。 CakePHP 不支持“开箱即用”的这个特性。
    【解决方案2】:

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

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

    注意:验证user表中的session为当前session后,在重新生成session id的时候也要记得更新user表中的session_id字段,否则每次session重新生成用户都会被注销。

    【讨论】:

    • 我认为 Uzyns 解决方案更适合我的项目,但我更喜欢这个解决方案。这更简洁,更简单,无需使用“丑陋”的查询来查找带有 LIKE 的数据。谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-05-20
    • 2012-05-28
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多