选民是否存在优先权概念?

时间:2014-09-19 16:17:22

标签: symfony silex

我需要在门户网站上开发一个带有Silex框架的选民系统(基于Symfony组件)。

这些不同的选民将检查当前用户是否在好国家,如果他在哪个程序中,如果他激活了网站上的广告,......我将它们与Unanime规则一起使用。

但我也想使用角色系统,我需要这个角色的选民优先于其他角色。

也就是说,如果角色选民弃权,那么其他选民可以通过共识决定做出决定,在任何其他情况下,它都是我想达成的共识角色。

Symfony是否提供了工具?我已经用矩阵模拟了肯定和一致决策管理的矩阵,但我还没有找到如何使角色选民比其他人更重要。

2 个答案:

答案 0 :(得分:1)

您可以为选民设置优先级:

your_voter:
    class: # ...
    public: false
    arguments: 
      # ...   
    tags:
        - { name: security.voter , priority: 255 }

答案 1 :(得分:1)

实际上你必须自己编写AccessDecisionManager来执行它:

在我的情况下,我需要RoleHierarchyVoter覆盖其他选票,除非弃权。如果它弃权我使用一致的策略:

class AccessDecisionManager implements AccessDecisionManagerInterface {

    private $voters;

    public function __construct(array $voters) {
        $this->voters = $voters;
    }

    public function decide(TokenInterface $token, array $attributes, $object = null) {
        $deny = 0;

        foreach ($this->voters as $voter) {
            $result = $voter->vote($token, $object, $attributes);
            if ($voter instanceof RoleHierarchyVoter) {
                if ($result === VoterInterface::ACCESS_GRANTED)
                    return true;
                elseif ($result === VoterInterface::ACCESS_DENIED)
                    return false;
                else
                    continue;
            }else {
                if ($result === VoterInterface::ACCESS_DENIED)
                    $deny++;
            }
        }

        if ($deny > 0)
            return false;
        else
            return true;
    }
}

注册我的自定义AccessDecisionManager:

$app['security.access_manager'] = $app->share(function (Application $app) {
    return new AccessDecisionManager($app['security.voters']);
});