我有同一个数据库运行两个cakephp2应用,但相应地具有不同身份验证表和不同$这个 - > Auth->的usermodel值。 认证工作正常,从一个应用程序的用户无法登录等。
但..作为应用程序使用同一个CakePHP的会话cookie,出现这种情况:当用户从应用程序“一”登录时,它可以访问任何验证程序中的“二”保护行动!
我可能会使用不同的用户角色和cookie名称。 但尽管如此,为什么验证组件检查会话时忽略Auth->的usermodel设置? 是否存在一种配置它的工作在这种情况下,正确的方法吗?
在此先感谢您的任何建议。
如果没有其他的配置,AuthComponent将写入验证的用户记录到Auth.User
会话密钥CakePHP中2 ,但它是可以改变的:
AuthComponent :: sessionKey
在当前用户的记录被存储会话密钥的名称。 如果未指定,这将是“Auth.User”。
(在CakePHP 1.3 ,这是不同的 : Auth.{$userModel name}
)
所以,如果您的应用程序共享会话,这是他们做的,如果cookie名称和Security.salt
匹配,登录的记录将被共享。
有两种可能性来解决这个问题:
分隔登录
只需设置一个不同的AuthComponent::sessionKey
您的两款车型。 这将允许他们继续登录的用户分别
分隔会议
两个应用程序配置不同的Cookie名称和盐,所以他们的会话不能互相覆盖。 这可能是清晰的解决方案,因为它也涉及其他会话密钥是双用的风险。
我有一个类似的问题,这就是为什么我已经开始在这个问题上的赏金。 基本上我有,它可以让用户从一个表,它可以让管理员登录使用不同的表应用的管理部分登陆应用的面向公众的一部分。 我的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')
)
);
我有另一个AdminController在那里我有这样的:
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')
)
);
但在这个问题中提及,从两会不相处,互相覆盖。 什么是克服这一点的最好方法是什么?
扩展模型/数据源/会话/ DatabaseSession.php会话使用类似MyDatabaseSession处理程序,并覆盖写入和读取方法。 也许简单地复制这两种方法的现有代码,并添加像
'APP_ID'=>配置::读( 'App.appId')
于读()的条件和做在写入方法是相同的。 而且不要忘记将字段添加到您的会话数据库模式,并配置为使用你的处理器的会话 。
<?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);
}
}
我不知道你的应用程序,所以是你写的应用程序ID的配置数据是你的,引导或beforeFilter()也许。 您应该添加它的会话被初始化,我认为之前,否则你会需要重新初始化会话或东西。 我把它留给你看看正确的点了。 :)