【问题标题】:Use ACL isGranted inside a voter isGranted在投票者 isGranted 中使用 ACL isGranted
【发布时间】:2015-10-04 19:58:42
【问题描述】:

编辑:请参阅下面的答案。

出于我的需要,我决定在我的应用程序中同时使用 ACL 和选民(也许这不是最好的方法,如果我错了,请告诉我)。

我的实体代表一个工厂,其中有: 生产线拥有车间拥有设备拥有备件。

我想授予经理或查看者访问线路级别的权限。为此,我使用 ACL 就行了。

因为每条线有5000多个备件,我不想写5000 ace告诉symfony这个被允许管理这条线的用户可以管理这条线的备件。

为了解决这个问题,我决定在acl检查前添加一个voter。

我做了一个 isGranted('edit',$sparepart) 由选民处理,在我自己的选民中,我想执行 isGranted('OPERATOR',$line)。

实际上,我还有很多事情要检查(例如用户工厂经理?),我喜欢将投票器和 ACL 结合起来。

不幸的是,我有点迷茫,我没有设法从我的选民那里调用正确的“isGranted”,我收到一个无限循环错误。

选民被授予

$authChecker = $this->get('security.authorization_checker');
$authChecker->isGranted('', $post);

ACL 被授予

$securityContext = $this->get('security.context');
$securityContext->isGranted('EDIT', $comment);

我知道这可能有点令人困惑,也许我的做法不对:s

感谢您的帮助!


所以我最终以另一种方式做到了这一点。 我使用一个选民并创建了新实体来管理我的访问权限。 我有一个 LineAccess 实体: 多对一:线 多对一:用户 sp_access: smallint 购物车访问:smallint Line_access: smallint

所以我自己检查所有内容,并管理我的 LineAccess 实体和 CustomerAccess 实体的链接。 最后,这是我认为最好的方式。祝你好运


这是好奇的完整问题:

对于每个用户,我希望能够使用此表选择他的权限。 例如,如果我检查波音(客户)管理。我将为这个 $customer 创建一个带有 OPERATOR 的 ACL/ACE。 而已。稍后,我想通过首先查看 $line 上的“OPERATOR”来检查此用户是否能够管理生产线,但如果它不存在,我将检查 $plant 上的“OPERATOR”,然后检查“OPERATOR” $客户。

如果我选择管理 Dreamliner 工厂,我会得到: 你可以看到我仍然可以选择访问备件和购物车的那种。我可以设置这个用户,它是工厂经理,另一个权限:备件管理。对于这种权限,我可以使用掩码生成器功能,例如,它允许我使用单个整数“SP_MANAGER、CART_VALIDATE、LINE MANAGE”进行存储。

你可以看到这里有点复杂,这就是为什么我认为 ACL 是我最好的朋友,但我想添加一个控制级别,我可以在其中手动选择哪个 isGranted() 方法,以及在哪个实体。

我试图准确,但这并不容易:s

非常感谢您的帮助!

【问题讨论】:

    标签: security symfony authorization acl


    【解决方案1】:

    Voters 和 ACL 都是独立的架构授权方法。我建议只使用 Voters,因为它们更易于理解、使用和扩展。

    有关此比较的更多详细信息,请查看these explanatory slides

    究竟哪些地方不能使用 Voters 代替 ACL?

    另外,为什么需要嵌套 Voters/ACL?

    【讨论】:

      【解决方案2】:

      感谢您的快速回答! 实际上,我认为我需要 ACL,因为我必须将我的权限放入数据库。这是我想要的那种权限:

      用户 A: 管理第 1 行(包括车间、设备、sp)并可以在该行中创建购物车。 查看第 2 行(无法管理该行但可以看到其内容),只能验证购物车。

      所以我认为使用 ACL 很好,因为这样我可以在数据库中写入每个对象的权限。 我也喜欢我可以使用面具这一事实。

      (在Plant层面也有同样的逻辑)

      【讨论】:

      • 比较评论我的回复。您也可以将选民与数据库一起使用。如果即使在演示之后(经过多年的 ACL 说服我)你仍然更喜欢 ACL 而不是 Voters,那么你当然可以使用它。
      猜你喜欢
      • 2019-03-07
      • 1970-01-01
      • 2011-10-19
      • 2018-01-17
      • 2012-06-09
      • 1970-01-01
      • 2013-03-28
      • 2012-09-16
      • 1970-01-01
      相关资源
      最近更新 更多