Php 为什么总是叫symfony2安全选民?

Php 为什么总是叫symfony2安全选民?,php,performance,security,symfony,Php,Performance,Security,Symfony,我使用的是symfony的acl系统的替代方案 投票人示例: 我的选民们看起来很像下面的人 class FoobarVoter implements VoterInterface { public function supportsClass($class) { return in_array($class, array( 'Example\FoobarBundle\Entity\Foobar

我使用的是symfony的acl系统的替代方案

投票人示例: 我的选民们看起来很像下面的人

    class FoobarVoter implements VoterInterface
    {
        public function supportsClass($class)
        {
            return in_array($class, array(
                'Example\FoobarBundle\Entity\Foobar',
            ));
        }

        public function supportsAttribute($attribute)
        {
            return in_array(strtolower($attribute), array('foo', 'bar'));
        }

        public function vote(TokenInterface $token, $object, array $attributes)
        {
            $result = VoterInterface::ACCESS_ABSTAIN

            if (!$this->supportsClass(get_class($object))) {
                return VoterInterface::ACCESS_ABSTAIN;
            }

            foreach ($attributes as $attribute) {
                $attribute = strtolower($attribute);

                // skip not supported attributes
                if (!$this->supportsAttribute($attribute)) {
                    continue;
                }

                [... some logic ...]
            }

            return $result;
        }
    }
问题: 减少对投票者的调用::vote() 我的投票者被包括在内,并在每次页面加载时被调用。即使他们不支持给定类的决策<代码>FoobarVoter::vote()始终被调用。即使
FoobarVoter::supportsClass()
FoobarVoter::supportsAttribute
返回false。因此,我需要检查
FoobarVoter::vote()
中的类和属性。这是行为标准吗?我怎样才能避免这个不必要的电话

限制选民人数
一些选民只在特定的群体中需要。有些只需要决定具体的类别。因此,在我的申请中,并非所有部分都需要一些选民。是否可以动态包含每个捆绑包/实体的投票者?e、 g.只有在访问/使用特定捆绑包或特定实体时,才将投票者纳入决策管理器链?

查看Symfony的源代码,似乎是因为使用这些方法(supportsClass和seupportsAttribute)将支持汇总到自身

这允许您的投票者做的是扩展应用管理器的情况。所以你没有详细说明你的选民的能力,而是整个投票过程。不管这是不是你想要的是别的

至于减少不必要的电话,一般情况下是没有必要的。系统采用以下三种方法之一进行设计:

  • 基于允许的
    决定性的
    )。这使用“基于允许”的投票。这意味着如果一个插件说“允许”,那么你就被允许了

  • 基于共识的
    decideConsensus
    )。这使用基于共识的许可,如果更多的选民同意允许而不是拒绝你被允许

  • 基于拒绝的
    decideUnanimous
    )。这使用“基于拒绝”的投票。这意味着如果一个插件说“拒绝”,那么你就被拒绝了。否则,您至少需要一笔补助金

  • 因此,考虑到它们都依赖于显式的Deny vs Allow,为每个请求运行所有插件实际上是有意义的。因为即使您不特别支持某个类,您也可能希望允许或拒绝该请求


    简而言之,通过支持属性限制投票者并没有什么好处。

    Ad 1)这是标准行为,因为您不需要限制投票者的使用-在这种情况下,调用这些方法会导致额外的过热。增加额外的检查只会增加过热。这一切都取决于选民的写作效率。不太可能。即使你能对它进行一点优化,我也怀疑它是否值得投入时间来改变。嗯,听起来和预期的一样。我唯一的想法是创建一个通用的投票者。该投票者将通过延迟加载实例化子投票者。次级选民为单个实体做出决策。因此,在每次页面加载时只检查一个投票者。这似乎是个好主意。你能做点什么吗?对不起,我还没意识到。如果你在这里发布你的解决方案,那就太好了。symfony的一个家伙建议无论如何使用symfony的acl。