我完成了关于cakephp的ACL组件的完整课程,但巨大的ACL组件似乎不符合我非常简单的要求。
我只有基于组的访问控制,三组是用户,管理员和管理员,第四组是没有登录的匿名用户,我没有创建任何组。
从acl概念创建三个表
aros - >这看起来有点冗余数据从groups表复制,我甚至不需要有一个组表,只需要在users表中的字段group_id。
acos - >这是控制器中的公共方法列表,我不得不使用AclExtra插件来填充表中的250多个动作,现在这是我认为不可管理的部分,我注意到用于填充acos表的工具无法每次都可靠地同步当我对控制器进行更改时,必须在远程站点完成相同的工作,因为每次更改都意味着可怕的事情!这也意味着我必须在更新和迁移期间进行数据库备份。
另一方面,如果我使用基于php文件的acos再次无法管理,因为我们必须确保在控制器和acl文件之间进行同步。
aros_acos - >显然
我们可以有一个更简单的机制,例如我拒绝使用Auth组件的所有操作,然后在每个操作中或者在beforeRender方法中我可以指定哪些方法对哪个组开放?
由于
答案 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
那里有一些很好的指示
假设:
- 在您的应用程序中,您创建了一个具有以下属性的用户模型:username,group_id,password,email,firstname, 姓氏等等。
- 您已将AuthComponent配置为通过
授权操作 醇>$this->Auth->authorize = array('Actions' => array('actionPath' => 'controllers/'),...)
现在,当用户(即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',
),
);
就是这样,现在您可以允许或拒绝基于角色的操作的权限。