Cakephp 2.0行/记录级Acl

时间:2011-11-16 10:10:14

标签: acl cakephp-2.0

我正在搞乱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。)

1 个答案:

答案 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数组中调整这些设置。