加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 15:56:30 所属栏目:PHP教程 来源:网络整理
导读:我实现了一个自定义的Symfony2 Voter,并将一个属性数组传递给denyAccessUnlessGranted的第一个参数,就像在我的控制器中一样: $attr = [ 'module' = 'userModule' 'action' = 'edit'];$this-denyAccessUnlessGranted($attr,$this,'Not authorize to edit use
我实现了一个自定义的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,$object = null)
{
    foreach ($this->voters as $voter) {
        $result = $voter->vote($token,$attributes);
        ...
    }
}


private function decideUnanimous(TokenInterface $token,$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,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.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读