【发布时间】: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