cakephp中的简化和可管理的ACL实现

时间:2014-04-27 02:30:27

标签: cakephp acl

我完成了关于cakephp的ACL组件的完整课程,但巨大的ACL组件似乎不符合我非常简单的要求。

我只有基于组的访问控制,三组是用户,管理员和管理员,第四组是没有登录的匿名用户,我没有创建任何组。

从acl概念创建三个表

aros - >这看起来有点冗余数据从groups表复制,我甚至不需要有一个组表,只需要在users表中的字段group_id。

acos - >这是控制器中的公共方法列表,我不得不使用AclExtra插件来填充表中的250多个动作,现在这是我认为不可管理的部分,我注意到用于填充acos表的工具无法每次都可靠地同步当我对控制器进行更改时,必须在远程站点完成相同的工作,因为每次更改都意味着可怕的事情!这也意味着我必须在更新和迁移期间进行数据库备份。

另一方面,如果我使用基于php文件的acos再次无法管理,因为我们必须确保在控制器和acl文件之间进行同步。

aros_acos - >显然

我们可以有一个更简单的机制,例如我拒绝使用Auth组件的所有操作,然后在每个操作中或者在beforeRender方法中我可以指定哪些方法对哪个组开放?

由于

1 个答案:

答案 0 :(得分:0)

有一个未记录的acl类PhpAcl使用起来比使用数据库驱动的ACL要简单得多,并且比使用ini的ACL更加动态。

Config/core.php

/**
 * The class name and database used in CakePHP's
 * access control lists.
 */
Configure::write('Acl.classname', 'PhpAcl');
// Configure::write('Acl.database', 'default');

这告诉您的ACL使用PhpAcl

然后打开Config/acl.php

那里有一些很好的指示

  

假设:

     
      
  1. 在您的应用程序中,您创建了一个具有以下属性的用户模型:username,group_id,password,email,firstname,   姓氏等等。
  2.   
  3. 您已将AuthComponent配置为通过$this->Auth->authorize = array('Actions' => array('actionPath' => 'controllers/'),...)
  4. 授权操作         

    现在,当用户(即jeff)成功验证并请求a   不允许的控制器动作(即/发票/删除)   默认(例如,通过$ this-> Auth->允许('编辑')在发票中   然后,AuthComponent会询问配置的ACL接口   如果获得访问权限。根据假设1.和2.这将是   通过调用Acl-> check()和

    来完成
    array('User' => array('username' => 'jeff', 'group_id' => 4, ...))
    
         

    作为ARO和

    '/controllers/invoices/delete'
    
         

    作为ACO。

我想为组或角色使用静态名称,以便您可以在用户表中添加role字段,然后像这样设置$ map:

 **
 * The role map defines how to resolve the user record from your application
 * to the roles you defined in the roles configuration.
 */
$config['map'] = array(
    'User' => 'User/username',
    'Role' => 'User/role',
);

对于我的应用,我们不使用基于用户的权限角色,因此我们可以从$ map中删除User

然后你需要设置一些角色:

/**
 * role configuration
 */
$config['roles'] = array(
    'Role/admin' => null,
);

不在此数组中的任何角色都将获得“角色/默认”

现在只需设置你的权限,它们就是非常自我解释的。

/**
 * rule configuration
 */
$config['rules'] = array(
    'allow' => array(
        '*' => 'Role/admin',
        'controllers/Reports/*' => 'Role/default',
        'controllers/EurRates/*' => 'Role/default',
        'controllers/Posts/index' => 'Role/default',
        'controllers/Users/(edit|index)' => 'Role/default',
    ),
    'deny' => array(
        'controllers/ProtectedController/*' => 'Role/default',
        'controllers/EurRates/(edit|add|delete)' => 'Role/default',
        'controllers/Reports/(edit|add|delete)' => 'Role/default',
        ),
);

就是这样,现在您可以允许或拒绝基于角色的操作的权限。