cakephp Auth - 无法通过“包含”从关联的表中获取数据


cakephp Auth - can't get data from associated table via 'contain'

在配置 cakephp 的身份验证组件时,我在使用"包含"索引(在此处描述)时遇到问题...

我试图实现的是基于权限的授权(而不是"管理员"、"用户"等角色)。因此,停留在常用的博客示例中,我有一个表"权限",其中可能包含字段 id 和名称并包含条目:

1: editOwnPosts
2: editAllPosts

这些权限连接到用户,如下所示:

/*
 * Model/User.php:
 */
public $hasAndBelongsToMany = array(
    'Right' => array(
        'className' => 'Right',
        'joinTable' => 'rights_users',
        'foreignKey' => 'user_id',
        'associationForeignKey' => 'right_id',
    )
);
/*
 * Model/Right.php:
 */
public $hasAndBelongsToMany = array(
    'User' => array(
        'className' => 'User',
        'joinTable' => 'rights_users',
        'foreignKey' => 'right_id',
        'associationForeignKey' => 'user_id',
    )
);

现在,对于每个授权,我都需要用户的权限。因此,例如,如果他尝试编辑帖子,我会检查用户的权限数组是否包含值"editAllPost"。如果是,我的授权函数返回 true。否则,它会检查是否包含"editOwnPosts",如果帖子是用户的,则返回 true,否则返回 false。

好吧,我在这个问题的答案中找到了我认为的解决方案:使用 cakephp 2.2 中引入的"包含"键。所以我在AppController中写道.php:

public $components = array(
    'Auth' => array(
        ...,
        'authenticate' => array(
            'Form' => array(
                'userModel' => 'User',
                'fields'    => array('username' => 'mail'),
                'contain'   => array('Right')
            ),
        ),
        'authorize'     => array('Controller')
); 

并测试它是否正在做我想要它做的事情,也在 AppController 中.php:

public function isAuthorized($user) {
    var_dump($this->Auth->user());
    return true;
}

但是我在任何页面上看到的var_dump只包含来自用户模型本身的直接数据,而不是相关权限。

我只是犯了一个小错误,还是我完全错误了"包含"索引的目的/功能?

您是否为干净的模型缓存设置了 debug =2?

我今天遇到了同样的问题。这是因为经过身份验证的用户存储在会话中。当您登录我们的用户时,他/她的信息将存储在会话中。

因此,如果要向用户添加其他包含,则必须确保从应用中注销所有用户。 再次登录后,可通过$this->Auth->user('ContainModel.fieldname')获得新的包含模型关联。