在选民 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层面也是一样的逻辑)
编辑:请参阅下面我的回答。
为了我的需要,我决定在我的应用程序中同时使用 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 工厂,我会得到:
你可以看到它在这里变得有点复杂,这就是为什么我认为 ACL 是我最好的朋友,但我想添加一个控制级别,我可以在其中手动 select 这是 Granted( ) 方法,以及在哪个实体上。
我试图做到准确,但这并不容易:s
非常感谢您的帮助!
Voters 和 ACL 都是独立的架构授权方法。我建议只使用 Voters,因为它们更容易理解、使用和扩展。
有关此比较的更多详细信息,请查看 these explanatory slides。
具体哪些地方不能使用 Voters 而不是 ACL?
还有,为什么要嵌套Voters/ACL?
感谢您的快速回答! 实际上,我认为我需要 ACL,因为我必须将我的权限放入数据库中。这是我想要的那种权限:
用户A: 管理第一行(包括车间、设备、sp),可以在该行创建购物车。 查看第2行(无法管理该行但可以看到内容)只能验证购物车。
所以我认为使用 ACL 很好,因为那样我可以在数据库中写入每个对象的权限。 我也喜欢我可以使用面具。
(在Plant层面也是一样的逻辑)