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

在cakephp中简化和可管理的ACL实现,cakephp,acl,Cakephp,Acl,我完整地学习了cakephp的ACL组件,但巨大的ACL组件似乎不能满足我非常简单的要求 我只有基于组的访问控制,三个组是用户、管理员和管理员。第四个组是匿名用户,没有登录,我没有为其创建任何组 根据acl概念,它创建了三个表 aros->这看起来有些冗余数据是从groups表复制的,我甚至不需要group表,只需要users表中的字段group\u id acos->这是控制器中的公共方法列表,我不得不使用AclExtra插件在表中填充250多个操作,现在这是我认为不可管理的部分,我注意到用于

我完整地学习了cakephp的ACL组件,但巨大的ACL组件似乎不能满足我非常简单的要求

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

根据acl概念,它创建了三个表

aros->这看起来有些冗余数据是从groups表复制的,我甚至不需要group表,只需要users表中的字段group\u id

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

另一方面,如果我使用基于php文件的acos,这也是不可管理的,因为我们必须确保控制器和acl文件之间的同步

aros\u acos->

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


感谢

有一个未记录的acl类
PhpAcl
,它比数据库驱动的acl更易于使用,比基于ini的acl更具动态性

Config/core.php中

/**
*CakePHP中使用的类名和数据库
*访问控制列表。
*/
Configure::write('Acl.classname','PhpAcl');
//Configure::write('Acl.database','default');
这会告诉您的ACL使用PhpAcl

然后打开
Config/acl.php

那里有一些很好的说明

假设:
  • 在应用程序中,您创建了具有以下属性的用户模型:用户名、组id、密码、电子邮件、名字、, 姓氏等等
  • 您已将AuthComponent配置为通过
    $this->Auth->authorize=array('actions'=>array('actionPath'=>
    “控制器/”),…)
  • 现在,当用户(即jeff)成功进行身份验证并请求 控制器不允许的控制器操作(即/发票/删除) 默认值(例如,通过发票中的$this->Auth->allow('edit') 控制器),然后AuthComponent将询问配置的ACL接口 如果允许访问。根据假设1。二,。这将是 通过调用Acl->check()完成

    array('User'=>array('username'=>'jeff','group\u id'=>4,…)
    
    作为ARO和

    “/controllers/invoices/delete”
    
    作为ACO

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

    **
    *角色映射定义如何从应用程序解析用户记录
    *添加到您在角色配置中定义的角色。
    */
    $config['map']=数组(
    “用户”=>“用户/用户名”,
    '角色'=>'用户/角色',
    );
    
    对于我的应用程序,我们不使用仅基于用户的权限角色,因此我们可以从$map中删除
    用户

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

    /**
    *角色配置
    */
    $config['roles']=数组(
    “角色/管理员”=>null,
    );
    
    不在此数组中的任何角色都将获得“角色/默认值”

    现在,只需设置您的权限,它们是非常不言自明的

    /**
    *规则配置
    */
    $config['rules']=数组(
    “允许”=>数组(
    “*”=>“角色/管理员”,
    “控制器/报告/*”=>“角色/默认值”,
    “控制器/EurRates/*”=>“角色/默认值”,
    'controllers/Posts/index'=>'Role/default',
    '控制器/用户/(编辑|索引)=>'角色/默认值',
    ),
    “拒绝”=>数组(
    “控制器/ProtectedController/*”=>“角色/默认值”,
    “控制器/欧元汇率/(编辑|添加|删除)”=>“角色/默认值”,
    '控制器/报告/(编辑|添加|删除)=>'角色/默认',
    ),
    );
    

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

    如果您只需要简单的基于组的访问,甚至不要触摸ACL。在这种情况下,这是一种开销-使用一种简单的方法,例如“取而代之”。@马克:是的,我意识到这不适用于这种情况,相反,它会变得很麻烦,我想这是一个超大规模的复杂门户