Session 具有两个会话模型的Cakephp身份验证组件

Session 具有两个会话模型的Cakephp身份验证组件,session,cakephp,authentication,cookies,cakephp-2.0,Session,Cakephp,Authentication,Cookies,Cakephp 2.0,我有两个cakephp2应用程序运行在同一个数据库上,但具有不同的Auth表和相应的$this->Auth->userModel值。 身份验证工作正常,来自一个应用程序的用户无法登录到另一个应用程序 但是。。由于应用程序使用相同的CAKEPHP会话cookie,因此会发生以下情况: 当应用“一”的用户登录时,它可以访问应用“二”中任何受身份验证保护的操作 我可能会使用不同的用户角色和cookie名称。 但是,为什么Auth组件在检查会话时忽略Auth->userModel设置?有没有办法将其配置

我有两个cakephp2应用程序运行在同一个数据库上,但具有不同的Auth表和相应的$this->Auth->userModel值。 身份验证工作正常,来自一个应用程序的用户无法登录到另一个应用程序

但是。。由于应用程序使用相同的CAKEPHP会话cookie,因此会发生以下情况: 当应用“一”的用户登录时,它可以访问应用“二”中任何受身份验证保护的操作

我可能会使用不同的用户角色和cookie名称。 但是,为什么Auth组件在检查会话时忽略Auth->userModel设置?有没有办法将其配置为在这种情况下正常工作


提前感谢您的建议。

我有一个类似的问题,这就是为什么我在这个问题上开始悬赏。基本上,我有一个面向公众的应用程序部分,它允许用户从一个表登录,还有一个应用程序的管理部分,它允许管理员使用不同的表登录。我的AppController看起来像这样:

public $components = array(
    'Session',
    'Auth' => array(
        'autoRedirect' => false,
        'authenticate' => array(
            'Form' => array(
                'userModel' => 'User'
            )
        ),
        'loginAction' => array('controller' => 'users', 'action' => 'login'),
        'loginRedirect' => array('controller' => 'users', 'action' => 'overview'),
        'logoutRedirect' => array('controller' => 'users', 'action' => 'loggedout')
    )
);
我还有另一个管理员控制器,我有:

public $components = array(
    'Session',
    'Auth' => array(
        'authenticate' => array(
            'CustomForm' => array(
                'userModel' => 'Admin'
            )
        ),
        'loginAction' => array('controller' => 'admin', 'action' => 'login'),
        'loginRedirect' => array('controller' => 'admin', 'action' => 'index'),
        'logoutRedirect' => array('controller' => 'home', 'action' => 'index')
    )
);

但正如在这个问题中提到的,这两个会话并不融洽,并且相互覆盖。克服此问题的最佳方法是什么?

使用类似MyDatabaseSession的内容扩展Model/Datasource/Session/DatabaseSession.php会话处理程序,并覆盖write和read方法。可能只是简单地复制这两个方法的现有代码,并添加如下内容

'app_id'=>Configure::read('app.appId')

对read()条件进行修改,并在write方法中执行同样的操作。不要忘记将该字段添加到会话数据库模式和


如果未进行其他配置,AuthComponent将把经过身份验证的用户记录写入CakePHP 2中的
Auth.user
会话密钥

AuthComponent::sessionKey

存储当前用户记录的会话密钥名称。如果未指定,则为“Auth.User”

(在CakePHP1.3中:
Auth.{$usermodelname}

因此,如果你的应用程序共享一个会话,如果cookie名称和
Security.salt
匹配,那么登录记录将被共享

解决这个问题有两种可能:

分开登录 只需为两个模型设置不同的
AuthComponent::sessionKey
。这将允许他们单独保留登录的用户

分开会议
为两个应用程序配置不同的Cookie名称和salt,以便它们的会话不能相互覆盖。这可能是一个更干净的解决方案,因为它还涵盖了其他会话密钥被重复使用的风险。

我不知道这是否与此有关,但当AuthComponent将用户存储到会话时,它总是使用
user
,无论用户模型名称实际上是什么-它的硬编码。这是错误的@tigrang,至少在2.0版本。我发誓前几天我在查看源代码时看到了硬编码-应该仔细检查,我的错。看,afair它在1.3年前也被修复了,事实上这是一个问题-在过去。:)会话密钥不会创建新的或不同的会话,只会更改身份验证数据在当前会话中的存储位置。是的,完全正确。这将防止两个应用程序的身份验证发生干扰。创建一个完全不同的会话是我的第二个解决方案。你的第一个解决方案成功了!我做到了:AuthComponent::$sessionKey='Auth.MyCustomModel'如何在CakePHP3中使用会话密钥?我很高兴你获得了赏金。在实现这一点时,我还学到了一些额外的东西:在
AppController
中设置
Auth
的作用域会导致多次登录出现问题<代码>'scope'=>array('User.delete_status'=>0)
中的
AppController
未被
'scope'=>array('Customer.delete_status'=>0)
中的
CustomersController
覆盖。取而代之的是,它被附加到了Cake-like
使用的SQL查询中。。其中User.delete\u status=0和Customer.delete\u status=0
。我必须将该位从AppController移动到UsersController(就像在相应的控制器中有
Auth
)。
<?php
App::uses('DatabaseSession', 'Model/Datasource/Session');
class ExtendedDatabaseSession extends DatabaseSession  {

    public function read($id) {
        $row = $this->_model->find('first', array(
                'conditions' => array(
                    'app_id' => Configure::read('App.appId'),
                    $this->_model->primaryKey => $id)));

        if (empty($row[$this->_model->alias]['data'])) {
            return false;
        }

        return $row[$this->_model->alias]['data'];
    }

    public function write($id, $data) {
        if (!$id) {
            return false;
        }
        $expires = time() + $this->_timeout;
        $record = compact('id', 'data', 'expires');
        $record[$this->_model->primaryKey] = $id;
        $record['app_id'] = Configure::read('App.appId');
        return $this->_model->save($record);
    }
}