2010-10-23 41 views
2

我只想组只有权限 - 我不需要基于用户的权限。蛋糕1.3手动(http://book.cakephp.org/view/1646/x11-2-4-1-Group-only-ACL)说:CakePHP ACL - 如何获取仅限组的权限?

在情况下,我们要简化每组 只有权限,我们需要在用户模型中实现 bindNode()。

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

这个方法会告诉ACL跳过 检查用户阿罗的和只检查 集团阿罗的。

但是,当我通过烘焙的控制器添加组和用户时,我仍然会得到一个带有嵌套组/用户的AROs表以获得基于用户的权限。我预期的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)); 
     } 
    } 
} 

回答

-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,我只能按组设置的权限,它工作正常。

+0

是的,“每个用户都必须分配group_id才能工作” - 那么为什么书中只显示其中只有组的结果ARO表? – Owen 2010-10-23 15:12:17

+0

我不知道这个答案。这是我没有意识到的一种选择,可能是这本书是正确的,但你的实现不是。我的读书是使用bindNode修改逻辑而不是模型,因此,你的实现是正确的,这本书是错误的。这很好,但任何人都可以编辑它。我注意到有一天Containable部分消失了。或者也许它从来没有! – Leo 2010-10-23 20:57:35

+1

我越使用CakePHP,我越喜欢它,但经常需要使用文档:) – Owen 2010-10-23 22:29:20

3

好吧。我假设你有一个组模型/表为好,其中也包含

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

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

您还在User模型的父节点中分配了组ID,这就是您ARO树的构造方式。我假设为了实现您的解决方案,只需删除用户模型中的acts_asparent_node声明。

要检查权限,您可以简单地使用User模型。

希望这可以清理一些事情。我刚开始进入ACL,所以我可能会误解bind行为中的某些内容。你可以看看是否有帮助。

0

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

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