Symfony2 - AccessDecisionManager 使用的安全投票者的优先级设置如何?

Fra*_*ste 4 acl authorization symfony

在 GitHub 上看到默认配置使用优先级标签,如下所示:

<service id="security.access.simple_role_voter" class="%security.access.simple_role_voter.class%" public="false">
    <tag name="security.voter" priority="245" />
</service>
Run Code Online (Sandbox Code Playgroud)

我在AccessDecisionManager本身中找不到对这个“优先级”的任何引用。

priority设置对决策过程有什么影响?

Nic*_*ich 6

优先级较高的侦听器/投票者首先被执行。

以下规则适用于侦听器优先级:

优先级 [...] 默认为 0。

该值可以从 -255 到 255,并且侦听器将按照其优先级(从高到低)的顺序执行。

(请参阅:如何创建事件侦听器。


应用程序/配置/security.yml

security.access_decision_manager设置定义了用于最终决策的策略:

security:
    access_decision_manager: 
        strategy: affirmative # <- strategy setting
Run Code Online (Sandbox Code Playgroud)

有3种策略可用:

  • unanimous - 1 个单一选民拒绝访问。
  • affirmative - 1 位单一选民授予访问权限。
  • consensus - 多数获胜。

(请参阅:更改访问决策策略


选民的决定由其方法的返回值表示vote()。例子:

use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;

public function vote(TokenInterface $token, $post, array $attributes)
{
    // ...
    
    return VoterInterface::ACCESS_GRANTED;
}
Run Code Online (Sandbox Code Playgroud)
  • VoterInterface::ACCESS_GRANTED 授权将由该选民授予;
  • VoterInterface::ACCESS_ABSTAIN 选民无法决定是否应授予授权;
  • VoterInterface::ACCESS_DENIED 该选民将拒绝授权。

(参见:如何使用投票者检查用户权限