1

我正在搞乱 cakephp 2.0 的访问列表,到目前为止,我在文档之后创建了一个非常简单的示例。

我已经建立了一个用户表和最重要的功能,如索引、添加、登录 ecc。并且与组表相关(每个用户都属于一个组)。

我还创建了一个包含不同内容(房屋)的“房屋”表。

然后我在 crud 模式下结合 acl 组件设置了 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。)?

4

1 回答 1

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 来执行此操作。我下面的示例也关注管理员,但您也可以用于超级管理员和用户组。

首先,拒绝管理员的一切,因为我们要单独授予权限:

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

于 2011-11-16T12:26:14.643 回答