在选民 isGranted 内部使用 ACL isGranted

Use ACL isGranted inside a voter isGranted

编辑:请参阅下面我的回答。

为了我的需要,我决定在我的应用程序中同时使用 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 Cart_access: smallint Line_access: smallint

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


这是给好奇的人的完整问题:

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

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

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

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

非常感谢您的帮助!

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

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

具体哪些地方不能使用 Voters 而不是 ACL?

还有,为什么要嵌套Voters/ACL?

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

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

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

(在Plant层面也是一样的逻辑)