16

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

4 回答 4

20

CakePHPAuthComponent一次只支持针对单个“用户”模型的身份验证。通过设置Auth::userModel属性选择模型,但它只接受字符串而不接受模型数组。

您可以userModel使用以下代码即时切换,但这需要您提前知道要切换到哪个模型(例如,您的用户必须从下拉列表中选择他们的帐户类型):

public function beforeFilter() {
    if (isset($this->data['User']['model'])) {
        $this->Auth->userModel = $this->data['User']['model'];
    }
}

您可以AuthComponent通过覆盖该AuthComponent::identify()方法来扩展核心以添加您想要的功能,以便它循环并尝试对每个模型进行身份验证:

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

除非您使用此技巧Auth,否则您必须将应用程序中出现的 替换AppAuth为使用扩展的 AuthComponent 。

于 2010-06-04T13:19:02.193 回答
2

虽然烦人,但我认为最好的解决方案可能是使用 Cake 内置的 ACL 支持(参见http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/simple-acl-受控应用程序.html)。

如果您按照您所说的方式进行身份验证,则必须跟踪控制器代码中的权限,检查 userModel 是什么。如果您使用访问控制列表,则权限树将已经存在于数据库中,这将大大简化您的代码,并使其更加模块化。

这也意味着重构您的数据模型,使其具有单个用户表和表,而不是每种用户类型的实体类。

我自己刚刚经历了这样做的过程...... :(

于 2011-07-17T18:26:49.827 回答
0

这也是一种可能

public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->authenticate = array(
        AuthComponent::ALL => array('userModel' => 'AnotherModel'),
        'Form',
        'Basic'
    );
}
于 2013-06-01T08:00:13.517 回答
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
    }
}
于 2014-10-14T07:46:36.203 回答