CakePHP检查会话存在于数据库中

Das*_*tca 6 authentication cakephp login

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

我转换了CakePHP如何使用这个帖子保存其会话,cakephp阻止用户同时从多个位置登录,但没有回答如何在创建新会话时终止旧会话.

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

我还阅读了关于Session Component和CakeSession Datasource 的CakePHP文档,希望可能有一个提示,但我找不到任何东西.

任何建议将不胜感激.

uzy*_*zyn 6

通常,您希望将会话处理切换到数据库,因此当您检测到相同的用户使用不同的用户登录时,您可以删除过时的会话session_id.

步骤,给你一个想法:

  1. 将会话处理切换到数据库

    Configure::write('Session.save', 'database');
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建cake_sessions表格

    cd app         
    Console/cake schema create Sessions
    
    Run Code Online (Sandbox Code Playgroud)

    然后,您将看到以下内容:

    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.
    
    Run Code Online (Sandbox Code Playgroud)
  3. 假设您绑定session_iduser_id

    $this->Session->write('user_id', 123456);
    
    Run Code Online (Sandbox Code Playgroud)
  4. data在会话数据库中迭代字段,如果相同的行user_id进入您的站点并使用不同的行,则删除该行session_id.

    不幸的是,CakePHP存储dataserialize()数据.您将不得不遍历cake_sessions表中的每一行以查找user_id包含在seralized中的匹配以data进行删除.

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

    DELETE FROM `cake_sessions` WHERE `cake_sessions`.`data` LIKE '%123456%';
    
    Run Code Online (Sandbox Code Playgroud)
  5. 这样,拥有旧版本的旧用户session_id将无法以登录用户身份继续访问该网站.