在cakephp中简化和可管理的ACL实现
我完整地学习了cakephp的ACL组件,但巨大的ACL组件似乎不能满足我非常简单的要求 我只有基于组的访问控制,三个组是用户、管理员和管理员。第四个组是匿名用户,没有登录,我没有为其创建任何组 根据acl概念,它创建了三个表 aros->这看起来有些冗余数据是从groups表复制的,我甚至不需要group表,只需要users表中的字段group\u id acos->这是控制器中的公共方法列表,我不得不使用AclExtra插件在表中填充250多个操作,现在这是我认为不可管理的部分,我注意到用于填充acos表的工具无法在每次我更改控制器时可靠地同步,同样的工作必须在远程站点上完成,因为每次更改都意味着可怕的事情!这也意味着我必须在更新和迁移期间进行数据库备份 另一方面,如果我使用基于php文件的acos,这也是不可管理的,因为我们必须确保控制器和acl文件之间的同步 aros\u acos-> 我们是否可以有一个更简单的机制,比如我使用Auth组件拒绝所有操作,然后在每个操作中,或者在beforeRender方法中,我可以指定哪些方法对哪些组开放在cakephp中简化和可管理的ACL实现,cakephp,acl,Cakephp,Acl,我完整地学习了cakephp的ACL组件,但巨大的ACL组件似乎不能满足我非常简单的要求 我只有基于组的访问控制,三个组是用户、管理员和管理员。第四个组是匿名用户,没有登录,我没有为其创建任何组 根据acl概念,它创建了三个表 aros->这看起来有些冗余数据是从groups表复制的,我甚至不需要group表,只需要users表中的字段group\u id acos->这是控制器中的公共方法列表,我不得不使用AclExtra插件在表中填充250多个操作,现在这是我认为不可管理的部分,我注意到用于
感谢有一个未记录的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。在这种情况下,这是一种开销-使用一种简单的方法,例如“取而代之”。@马克:是的,我意识到这不适用于这种情况,相反,它会变得很麻烦,我想这是一个超大规模的复杂门户