Cakephp Auth具有多个“用户”表

时间:2010-06-04 11:25:04

标签: cakephp authentication cakephp-1.3 multiple-tables

我想知道如何只处理一个身份验证过程和多个表中的“用户”。我有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
    }
}

4 个答案:

答案 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
    }
}