微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 为什么Symfony2 Voter一致的决策策略循环传递属性?

我实现了一个自定义的Symfony2 Voter,并将一个属性数组传递给denyAccessUnlessGranted的第一个参数,就像在我的控制器中一样:

$attr = [
    'module' => 'userModule'
    'action' => 'edit'
];
$this->denyAccessUnlessGranted($attr, $this, 'Not authorize to edit user');

如果决策管理者的方法被设置为肯定的话,这可以正常工作.然而,当我转向一致的方法时,由于我的自定义选民的设计方式,所有突然的事情都不起作用.我浏览了Symfony源代码,发现原因是因为确定一致方法的投票结果的方法调用所有注册选民之前循环通过属性(而不是简单地将它们传递给选民)肯定和共识的方法).

下面包括Symfony / Component / Security / Core / Authorization / AccessDecisionManager的片段:

private function decideAffirmative(TokenInterface $token, array $attributes, $object = null)
{
    $deny = 0;
    foreach ($this->Voters as $Voter) {
        $result = $Voter->Vote($token, $object, $attributes);
        ...
     }
}

private function decideConsensus(TokenInterface $token, array $attributes, $object = null)
{
    foreach ($this->Voters as $Voter) {
        $result = $Voter->Vote($token, $object, $attributes);
        ...
    }
}


private function decideUnanimous(TokenInterface $token, array $attributes, $object = null)
{
    $grant = 0;
    // ***** THIS IS THE ISSUE: WHY LOOP THROUGH THE ATTRIBUTES ****
    foreach ($attributes as $attribute) {
        foreach ($this->Voters as $Voter) {
            $result = $Voter->Vote($token, $object, array($attribute));
            ...
        }
    }
 }

一致决策的是第三个.循环遍历属性的原因是什么?这意味着我将根据我使用的策略做出重新编码我的自定义选民,我觉得这很奇怪.

PS:我的自定义选民的实施细节对这个问题并不重要,所以我决定不把它放在这里.

PS#2:这不是我的代码,这是来自Symfony2框架(https://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/Security/Core/Authorization/AccessDecisionManager.php)的代码.我只是想知道它背后的原因,以便我可以正确使用选民功能.我猜最好的人回答这个问题的人就是那些熟悉Symfony2源代码的人.

解决方法:

看看RoleVoter班.

如果授权作为参数传递的任何属性(至少有一个允许投票),则Voter :: Vote()返回VoterInterface :: ACCESS_GRANTED.如果有许多属性,有些属性已经授权,有些则没有 – 无论如何都要投入VoterInterface :: ACCESS_GRANTED.

但是一致投票需要每个属性都被授权(没有拒绝投票);因此我们需要分别测试每个属性.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐