我想知道如何只处理一个身份验证过程和多个表中的“用户”。我有4个用户表:用户,管理员,艺术家,茶叶都有特定字段,但我希望所有这些用户只能通过主页上的一个表单连接,然后重定向到他们的特定仪表板。
我认为重定向不应该是一个问题,添加的一些路线应该可行,但我真的不知道在哪里看/开始这么做。
干杯,
尼古拉斯。
编辑:这是最终解决方案(感谢deizel)
App::import('Component', 'Auth');
class SiteAuthComponent extends AuthComponent {
function identify($user = null, $conditions = null) {
$models = array('User', 'Admin', 'Artist');
foreach ($models as $model) {
$this->userModel = $model; // switch model
$this->params["data"][$model] = $this->params["data"]["User"]; // switch model in params/data too
$result = parent::identify($this->params["data"][$model], $conditions); // let cake do its thing
if ($result) {
return $result; // login success
}
}
return null; // login failure
}
}
答案 0 :(得分:20)
CakePHP的AuthComponent
一次只支持针对单个“用户”模型的身份验证。通过设置Auth::userModel
property来选择模型,但它只接受字符串而不接受模型数组。
您可以使用以下代码动态切换userModel
,但这需要您事先知道要切换到哪个型号(例如,您的用户必须从下拉列表中选择其帐户类型):< / p>
public function beforeFilter() {
if (isset($this->data['User']['model'])) {
$this->Auth->userModel = $this->data['User']['model'];
}
}
您可以扩展核心AuthComponent
以通过覆盖AuthComponent::identify()
method来添加所需的功能,以便它循环并尝试对每个模型进行身份验证:
App::import('Component', 'AuthComponent');
class AppAuthComponent extends AuthComponent {
function identify($user = null, $conditions = null) {
$models = array('User', 'Admin', 'Artist', 'TeamAdmin');
foreach ($models as $model) {
$this->userModel = $model; // switch model
$result = parent::identify($user, $conditions); // let cake do it's thing
if ($result) {
return $result; // login success
}
}
return null; // login failure
}
}
除非您使用this trick,否则必须使用Auth
替换应用中AppAuth
的出现次数才能使用扩展的AuthComponent。
答案 1 :(得分:2)
虽然很烦人,但我认为最好的解决方案可能是使用Cake内置的ACL支持(参见http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/simple-acl-controlled-application.html)。
如果您按照自己的方式进行身份验证,则必须跟踪控制器代码中的权限,检查userModel是什么。如果您使用访问控制列表,则数据库中已存在权限树,这将大大简化您的代码,并使其更加模块化。
这也意味着重构您的数据模型,以便为每种类型的用户提供单个用户表和组表,而不是实体类。
我刚刚完成了这样做的过程...... :(
答案 2 :(得分:0)
这也是一种可能性
public function beforeFilter() {
parent::beforeFilter();
$this->Auth->authenticate = array(
AuthComponent::ALL => array('userModel' => 'AnotherModel'),
'Form',
'Basic'
);
}
答案 3 :(得分:0)
以下是deizel建议并由Nicolas修改的最终解决方案:
App::import('Component', 'Auth');
class SiteAuthComponent extends AuthComponent {
function identify($user = null, $conditions = null) {
$models = array('User', 'Admin', 'Artist');
foreach ($models as $model) {
$this->userModel = $model; // switch model
$this->params["data"][$model] = $this->params["data"]["User"]; // switch model in params/data too
$result = parent::identify($this->params["data"][$model], $conditions); // let cake do its thing
if ($result) {
return $result; // login success
}
}
return null; // login failure
}
}