7

私は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::supportsAttributefalseを返しても。したがって、内部のクラスと属性を確認する必要がありますFoobarVoter::vote()。この動作は標準ですか?この不要な呼び出しを防ぐにはどうすればよいですか。

投票者をバンドルに制限する

一部の有権者は、特定のバンドル内でのみ必要です。特定のクラスについて決定するためだけに必要なものもあります。したがって、一部の有権者は私のアプリケーションのすべての部分で必要とされるわけではありません。バンドル/エンティティごとに投票者を動的に含めることは可能ですか?たとえば、特定のバンドルまたは特定のエンティティがアクセス/使用される場合にのみ、投票者を意思決定マネージャーチェーンに含めますか?

4

1 に答える 1

8

Symfonyのソースコードを見ると、AccessDecisionManagerはそれらのメソッド(supportsClassとseupportsAttribute)を使用してサポートをそれ自体にロールアップしているためと思われます。

これにより有権者ができることは、マネージャーが適用されるケースを延長することです。つまり、あなたは有権者の能力ではなく、投票プロセス全体の能力を詳しく説明しているのです。それがあなたが望むものであるかどうかは別のものです...

不必要な呼び出しを減らす限り、それは一般的な場合には不必要ではありません。システムは、次の3つの方法のいずれかを使用して設計されています。

  1. ベース( )を許可しdecideAffirmativeます。これは「許可ベース」の投票を使用します。つまり、1つのプラグインが「許可」と言った場合、許可されます。

  2. コンセンサスベースdecideConsensus)。これは、コンセンサスベースの許可を使用します。この場合、許可されることを拒否するよりも許可することに同意する有権者の方が多くなります...

  3. 拒否ベースdecideUnanimous)。これは「拒否ベース」の投票を使用します。つまり、1つのプラグインが「拒否」と言った場合、拒否されます。それ以外の場合は、少なくとも1つの助成金が必要です。

したがって、それらすべてが明示的なDeny vs Allowに依存していることを考えると、すべてのリクエストに対してすべてのプラグインを実行することは実際には理にかなっています。クラスを特にサポートしていなくても、そのリクエストを許可または拒否したい場合があるためです。

要するに、supports属性によって投票者を制限することによって得ることはあまりありません。

于 2013-06-24T15:24:28.663 に答える