【问题标题】:Cakephp 2.0 row/record-level AclCakephp 2.0 行/记录级 Acl
【发布时间】:2011-11-16 10:10:14
【问题描述】:

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

【问题讨论】:

  • 关于这个问题的任何更新,我也在尝试使用 CakePHP ACL 2.6.1 版实现行级控制。

标签: acl cakephp-2.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

编辑

我将尝试根据下面留下的 cmets 进行修改。我认为您可能仍在错误地设置规则。我将使用命令行示例(因为它既可以键入也可以在实践中执行),但您可以轻松编写 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 数组中调整这些设置。

【讨论】:

  • 您好,感谢您的回复!这似乎工作正常,但如果我尝试通过网络界面编辑该房子,它说我无权访问该资源。我也尝试像这样手动设置规则: $this->Acl->deny(array('model' => 'User', 'foreign_key' => 4), 'Houses'); $this->Acl->allow(array('model' => 'User', 'foreign_key' => 4), 'Houses', 'read'); $this->Acl->allow(array('model' => 'User', 'foreign_key' => 4), array('model' => 'House', 'foreign_key' => 1));但是,如果我允许用​​户 4 拥有对整个 House 模型的更新访问权限,它就可以工作。再次感谢亚历克斯
  • 不确定我是否完全理解现在发生的事情。如果用户对 House 模型有更新访问权限,但拒绝对 House.4 进行更新访问,那么它不应该给你更新访问权限。您还在寻找返回 false 的支票,还是解决了那部分问题?
  • 嗯,不,我认为在描述我的问题时犯了一些错误:我想要实现的是,一组用户(管理员)对所有记录具有只读访问权限,但更新访问权限他们中有一些。在这里,我尝试执行以下操作:1.)拒绝用户访问(稍后,我将为用户组执行此操作,但为简单起见,我只修改单个用户)2.)允许只读用户可以访问所有记录 3.) 允许用户更新一条特定记录。难道我做错了什么? 10000000000 再次感谢!
  • 我已经更新了我的答案,根据我的理解,我认为这些步骤可能会有所帮助。我希望这会有所帮助!
  • 嘿,再次感谢,我已经成功运行了这些命令(一个 mod:我使用 House.1 而不是 Houses.1,因为它是模型名称)。但它不会让我编辑记录......奇怪......我很确定这是我在某处犯的一个简单、小而愚蠢的错误......基于行的acl是否可以在不修改cakephp的情况下进行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 2011-03-03
相关资源
最近更新 更多