CakePHP ACL - 如何获得仅限组的权限?

时间:2010-10-23 10:42:58

标签: cakephp acl cakephp-1.3

我只想要群组权限 - 我不需要基于用户的权限。蛋糕1.3手册(http://book.cakephp.org/view/1646/x11-2-4-1-Group-only-ACL)说:

  

如果我们想要简化的每组   只有权限,我们需要实现   用户模型中的bindNode()。

function bindNode($user) {
    return array('Group' => array('id' => $user['User']['group_id']));
}
  

此方法将告诉ACL跳过   检查用户Aro并仅检查   Aro集团。

然而,当我通过烘焙控制器添加组和用户时,我仍然最终得到一个带有嵌套组/用户的ARO表,用于基于用户的权限。我希望ARO表看起来像这样(因为手册说这就是它的样子):

+----+-----------+-------+-------------+-------+------+------+
| id | parent_id | model | foreign_key | alias | lft  | rght |
+----+-----------+-------+-------------+-------+------+------+
|  1 |      NULL | Group |           1 | NULL  |    1 |    2 |
|  2 |      NULL | Group |           2 | NULL  |    3 |    4 |
|  3 |      NULL | Group |           3 | NULL  |    5 |    6 |
+----+-----------+-------+-------------+-------+------+------+

但是看起来像这样:

+----+-----------+-------+-------------+-------+------+------+
| id | parent_id | model | foreign_key | alias | lft  | rght |
+----+-----------+-------+-------------+-------+------+------+
|  1 |      NULL | Group |           1 | NULL  |    1 |    4 |
|  2 |      NULL | Group |           2 | NULL  |    5 |    8 |
|  3 |      NULL | Group |           3 | NULL  |    9 |   12 |
|  4 |         1 | User  |           1 | NULL  |    2 |    3 |
|  5 |         2 | User  |           2 | NULL  |    6 |    7 |
|  6 |         3 | User  |           3 | NULL  |   10 |   11 |
+----+-----------+-------+-------------+-------+------+------+

这是我的用户模型:

class User extends AppModel {
    var $name = 'User';

    var $actsAs = array('Acl' => array('type' => 'requester'));

    var $hasMany = array(
        'Post' => array(
            'className' => 'Post',
            'foreignKey' => 'user_id'
        )
    );
    var $belongsTo = array(
        'Group' => array(
            'className' => 'Group',
            'foreignKey' => 'group_id'
        )
    );

    /**
     *
     * In case we want simplified per-group only permissions
     * see http://book.cakephp.org/view/1547/Acts-As-a-Requester
     * @param unknown_type $user
     */
    function bindNode($user) {
        return array('Group' => array('id' => $user['User']['group_id']));
    }

    function parentNode() {
        if (!$this->id && empty($this->data)) {
            return null;
        }
        if (isset($this->data['User']['group_id'])) {
        $groupId = $this->data['User']['group_id'];
        } else {
            $groupId = $this->field('group_id');
        }
        if (!$groupId) {
        return null;
        } else {
            return array('Group' => array('id' => $groupId));
        }
    }
}

3 个答案:

答案 0 :(得分:3)

好。我假设你有一个Groups模型/表,它也包含

var $actsAs = array('Acl' => array('type' => 'requester'));

这就是您的ARO表包含两个实例的原因。绑定让您更改分配了特定模型的ARO树的节点。文档中描述的解决方案意味着如果使用ACL->check()检查模型,则使用新绑定的ARO节点。

您还在User模型的父节点中分配组ID,即您按照原样构建ARO树。我假设为了实现您的解决方案,只需删除用户模型中的acts_asparent_node声明即可。

要检查权限,您只需使用User模型即可。

希望这可以解决一些问题。我刚开始进入ACL因此,我可能误解了bind行为中的某些内容。你可以看看是否有帮助。

答案 1 :(得分:0)

问题是您仍然包含数据库中的旧信息。

如果清空所有表,包括aros,acos和aros_acos,再添加创建组和用户,您将获得记录的输出。

答案 2 :(得分:-1)

我从未使用过那种方法,但没有任何用户的群体概念似乎毫无意义。 Cake使用用户和组信息来决定谁属于哪个组,以便它可以应用适当的组权限。

查看“本书”,您的用户必须设置了group_id:

  

“每个用户都必须已分配   group_id为此工作。“

CREATE TABLE users (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL UNIQUE,
    password CHAR(40) NOT NULL,
    group_id INT(11) NOT NULL,
    created DATETIME,
    modified DATETIME
);

在我的应用程序中,不使用bindNode,我只按组设置权限,它可以正常工作。