6

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

我转换了 CakePHP 如何使用这篇文章 cakephp 保存其会话来防止用户同时从多个位置登录,但没有给出关于如何在创建新会话时终止旧会话的答案。

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

我还阅读了有关会话组件和 CakeSession 数据源的 CakePHP 文档,希望可能有提示,但我找不到任何东西。

任何建议将不胜感激。

4

2 回答 2

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. 假设你绑定session_iduser_id

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

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

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

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

于 2012-07-25T15:31:32.877 回答
3

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

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

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

于 2012-07-25T19:45:52.637 回答