Session 具有两个会话模型的Cakephp身份验证组件
我有两个cakephp2应用程序运行在同一个数据库上,但具有不同的Auth表和相应的$this->Auth->userModel值。 身份验证工作正常,来自一个应用程序的用户无法登录到另一个应用程序 但是。。由于应用程序使用相同的CAKEPHP会话cookie,因此会发生以下情况: 当应用“一”的用户登录时,它可以访问应用“二”中任何受身份验证保护的操作 我可能会使用不同的用户角色和cookie名称。 但是,为什么Auth组件在检查会话时忽略Auth->userModel设置?有没有办法将其配置为在这种情况下正常工作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设置?有没有办法将其配置
提前感谢您的建议。我有一个类似的问题,这就是为什么我在这个问题上开始悬赏。基本上,我有一个面向公众的应用程序部分,它允许用户从一个表登录,还有一个应用程序的管理部分,它允许管理员使用不同的表登录。我的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);
}
}