我正在搞乱cakephp 2.0的访问列表, 到目前为止,我根据文档创建了一个非常简单的示例。
我已经设置了一个用户表和最重要的功能,如index,add,login ecc。并且与组表相关(每个用户都属于一个组)。
我还创建了一个包含不同内容(房屋)的“房屋”表。
然后我在crud模式下结合acl-component设置auth, 包括aco和aro树。
到目前为止一切顺利,到目前为止一切正常,我可以允许或拒绝每个用户的单一操作。 但是,我想要进一步的访问控制,例如用户只能管理特定的房屋。 所以我为每个房子设置了一个aco,只允许对用户进行房屋的读取访问,并且只允许对所需房屋进行更新访问。 但它不会起作用!无论我做什么..我都无法访问编辑操作。 我的树木在这里:
Aco:
[1] Houses
[5] House.1
[6] House.2
[2] Users
Aro:
[1] superadmin
[4] User.1
[1] admin
[5] User.2
[7] User.4
[3] customer
[6] User.3
最后是aros_acos表:
id aro_id aco_id _create _read _update _delete
4 1 1 1 1 1 1
5 1 2 1 1 1 1
6 2 1 1 1 1 1
7 3 1 0 1 0 0
8 7 1 -1 1 1 -1
9 7 5 1 1 1 1
事实是,如果我尝试快速检查:
var_dump($this->Acl->check(
array('model' => 'User',
'foreign_key' => 4),
array('model' => 'House',
'foreign_key' => 1),
'update'));
它回馈真实!
奇怪......我做错了什么?有没有办法正确调试acl组件(组件正在检查acos和aros的信息,看到ecc。)答案 0 :(得分:1)
根据您的aro_aco表,看起来这是正确的行为。 User.4属于具有更新权限的admins组。在第8行中设置为true。第8行中有一条专门针对User.4的规则,但您已经专门向该行中的该用户授予了更新权限。看起来ACL规则的工作方式与您设置的完全相同。要防止User.4使用更新权限,请在cake命令行运行此命令以更新User.4的规则:
cake acl deny User.4 House.1 update
运行支票时应该返回false:
cake acl check User.4 House.1 update
修改强>
我将根据下面的评论尝试修改此内容。我认为您可能仍然错误地设置规则。我将使用命令行示例(因为它既可以键入也可以在实践中执行)但您可以轻松编写PHP来执行此操作。我下面的示例也关注管理员,但您也可以使用superadmin和用户组。
首先,拒绝管理员的所有内容,因为我们要单独授予权限:
cake acl deny admin Houses all
然后,向管理员授予只读权限,以便他们都可以读取房屋:
cake acl grant admin Houses read
最后,将更新权限授予获得更新权限的特定用户:
cake acl grant User.4 Houses.1 update
这些权限应允许User.4读取和更新House记录。请记住,如果您已经为User.4创建了拒绝或允许记录,则此示例可能无效。您可能希望截断您的aco_aro表并重新开始,因为此时它很小。
如果所有acl检查都有效,但行为仍然不正确,那么ACL组件如何授权操作可能会出现问题。您可能需要在$ beforeFilter或$ components数组中调整这些设置。