Cakephp 2.1重命名没有ACL模型的ACL表

时间:2014-03-04 08:05:07

标签: php cakephp acl

我在使用ACL时遇到问题。在我的CoreUsersController中,我进行以下调用:

if(!$this->Acl->check('User::'.$user['User']['id'], 'CoreUser', 'read')) {
    die('PERM DENIED');
}

ACL包含在AppController中作为组件。数据库表看起来像:

  • table“acos”
  • 表“core_groups”(作为aros)
  • 表“aros_acos”作为core_groups和acos之间的连接。

以下是错误投放: 错误:在数据源默认值中找不到模型Aro的表aros。


我的代码:

1。用户 - 型号:

    App::uses('AuthComponent', 'Controller/Component');

    class CoreUser extends AppModel {

            public $useDbConfig = 'default';
            public $useTable    = 'core_users';

            public $hasAndBelongsToMany = array(
                'MemberOf' => array(
                    'className' => 'CoreGroup',
                    'joinTable' => 'core_users_groups',
                    'foreignKey' => 'user_id',
                    'associationForeignKey' => 'group_id'
                )
            );

            public $name = 'User';
            public $actsAs = array('Acl' => array('type' => 'both'));

            public function parentNode() {
                // stuff in here should be correct
            }

}

2。基 - 型号:

App::uses('AppModel', 'Model');
App::uses('AuthComponent', 'Controller/Component');

class CoreGroup extends AppModel {

        public $useDbConfig = 'default';
        public $useTable    = 'core_groups';

        public $hasAndBelongsToMany = array(
            'Member' => array(
                'className' => 'CoreUser',
                'joinTable' => 'core_users_groups',
                'foreignKey' => 'group_id',
                'associationForeignKey' => 'user_id'
            )
        );
        public $name = 'Group';
        public $actsAs = array('Acl' => array('type' => 'requester'));

        public function parentNode() {
            return null;
        }
}

我的问题:如何告诉ACL使用“core_groups”-Table而不是“aros”-table?注意:我将Cake-Book建议的“ActsAs”添加到两个模型中!

1 个答案:

答案 0 :(得分:1)

如果您想继续使用Cake的ACL,那么最好有三个单独的表:

1. aros
2. acos
3. aros_acos

可以使用AclShell生成这些:

./Console/cake schema create DbAcl

不建议将您的某个应用模型用作ARO或ACO,因为ARO和ACO模型是以树形结构实现的。这些应该与您的应用中的“作为ACO / ARO”的模型分开。

当您将$actsAs属性中的Acl行为附加到您的用户/组模型时,Acl行为的回调就会启动。这些回调会使用您的用户/组模型中定义的parentNode()方法来创建对用户/组模型中创建的行的ARO 引用。这些引用分别存储在ARO 表中,指向实际的用户和组。因此,ARO表是必要的。

我建议你仔细阅读本书中的the ACL tutorial,因为你的实现非常相似。请注意使用用户和组之间的HABTM关系,因为这需要稍微调整。