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

CakePHP ACL-如何获得仅限组的权限?,cakephp,acl,cakephp-1.3,Cakephp,Acl,Cakephp 1.3,我只需要组权限-我不需要基于用户的权限。蛋糕1.3手册(http://book.cakephp.org/view/1646/x11-2-4-1-Group-only-ACL)说: 以防我们希望每组都简化 只有权限,我们需要实现 用户模型中的bindNode() 此方法将告诉ACL跳过 正在检查用户Aro并仅检查 阿罗组 但是,当我通过烘焙控制器添加组和用户时,我仍然会得到一个AROs表,其中包含嵌套的组/用户,用于基于用户的权限。我希望AROs表是这样的(因为手册上说这就是它的样子): 但实际上

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

以防我们希望每组都简化 只有权限,我们需要实现 用户模型中的bindNode()

此方法将告诉ACL跳过 正在检查用户Aro并仅检查 阿罗组

但是,当我通过烘焙控制器添加组和用户时,我仍然会得到一个AROs表,其中包含嵌套的组/用户,用于基于用户的权限。我希望AROs表是这样的(因为手册上说这就是它的样子):

但实际上是这样的:

+----+-----------+-------+-------------+-------+------+------+
| 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));
        }
    }
}

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

但是,查看“the Book”,您的用户必须设置组id:

“每个用户都必须分配 要使其工作,请使用组id。“


在我不使用bindNode的应用程序中,我只按组设置权限,效果很好。我假设您也有一个组模型/表,其中还包含

var $actsAs = array('Acl' => array('type' => 'requester'));
这就是ARO表包含这两个实例的原因。Bind让您更改指定了特定模型的ARO树的节点。文档中描述的解决方案意味着,如果您使用
ACL->check()
检查模型,那么它将使用新绑定的ARO节点

您还将在父节点中为
用户
模型分配组id,这就是ARO树的构造方式。我假设,为了实现您的解决方案,只需删除用户模型中的
acts\u as
parent\u节点
声明即可

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


希望这能把事情弄清楚一点。我刚开始进入
ACL
,因此,我可能误解了
bind
行为中的某些内容。您可以查看这是否有帮助。

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


如果您清空所有表,包括ARO、ACO和ARO\U ACO,并再次添加创建组和用户,您将获得记录的输出。

是的,“每个用户都必须分配组id才能工作”-那么为什么书中显示的结果aros表中只有组?我不知道答案。这是一个我不知道的选项,可能是这本书是正确的,但您的实现不是。我对它的理解是,bindNode的使用修改了逻辑而不是模型,因此,您的实现是正确的,而这本书是错误的。很好,但是任何人都可以编辑它。前几天我注意到一些可容纳的部分已经消失了。也许它从来就不在那里!我越是使用CakePHP,我就越喜欢它,但我经常非常努力地使用文档:)
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));
        }
    }
}
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
);
var $actsAs = array('Acl' => array('type' => 'requester'));