Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Symfony投票者中使用isgrated_Symfony_Security - Fatal编程技术网

在Symfony投票者中使用isgrated

在Symfony投票者中使用isgrated,symfony,security,Symfony,Security,有时,我有一个页面,我想对不同规则的复杂组合做出反应,这些规则合起来只是一件事:“当前用户可以这样做吗?” 目前,这些检查大多直接在我的控制器内,因此我有以下示例: if($this->isGranted('DRAFT_EDITOR', $draft) && $now < $deadline && $draft->getStatus() != Draft::STATUS_FINAL) {...} 然后,这将转到DraftCanEdit投票者,该

有时,我有一个页面,我想对不同规则的复杂组合做出反应,这些规则合起来只是一件事:“当前用户可以这样做吗?”

目前,这些检查大多直接在我的控制器内,因此我有以下示例:

if($this->isGranted('DRAFT_EDITOR', $draft) && $now < $deadline && $draft->getStatus() != Draft::STATUS_FINAL) {...}
然后,这将转到DraftCanEdit投票者,该投票者将此帖子顶部的IF语句中的所有检查封装在一个地方,并使更改使草稿可编辑的规则变得容易,更难意外地遗漏条件或在某个地方将其搞糟并创建漏洞等

问题是投票者不能调用isgrated(),因为它被认为是一个循环引用,只是为了向投票者注入security.authorization\u checker服务

对我来说,从语义上讲,投票者调用isgrated似乎是投票者继承的一种形式,只要投票者不支持它传递给isgrated的属性/主题,就不应该导致任何类型的循环引用问题

当然,我可以在DraftCanEditVoter中复制DraftEditorVoter逻辑,也可以在DraftCanEditVoter中实例化DraftEditorVoter,但这两种方法都不理想,不仅是因为代码重复,而且因为我实际上有两个投票者,它们一起决定某人是否是草稿编辑器


我也知道我可以通过创建自己的非投票者对象并直接使用它来封装IF条件,但我认为这可能有点反模式。

在我看来,您可以做两件事:

  • 我对你的问题很好奇,所以我查了一下文件。这样,我就看到了文档的这一部分,即
    AccessDecisionManager
    :。我打赌,你可以用它来检查你的
    DraftEditorVoter

  • 您可以将
    DraftEditorVoter
    注入
    DraftCanEditVoter
    。这样,您就可以使用它的
    voteOnAttribute
    方法,而无需创建依赖循环。您需要调用它的所有内容都已传递给您的投票者,因此参数应该不会有问题


  • 能否将
    DraftEditorVoter
    注入您的
    DraftCanEditVoter
    投票者?还有,选民不是为了得出一个共同的结论吗?比如,至少有一人必须投赞成票,或者至少有50%的人必须投赞成票,或者没有人必须投反对票。将策略更改为“一致”,然后让两个投票人都处理草案。另一种方法是只使用一个DraftVoter。哦,奇怪,我以为我已经检查了文档,但什么也没找到,它就在教程中@库卡斯没有冒犯的意思;)
    if($this->isGranted('DRAFT_CAN_EDIT') {}