2

Symfony 2 でのカスタム ボーターの作成について読んでいます。このページによると、オブジェクトを securitycontext の isGranted メソッドに渡すことができます。これは、自分のコントローラーで行ったものです。

$page = new Page();

if ( ! $securityContext->isGranted('CONTENT_CREATE', $page)) {
    throw new AccessDeniedException('Fail');
}

投票メソッドはそれを受け入れる必要があるように見えますが、$object パラメーターで get_class を呼び出すと、Page エンティティを取得する代わりに、次のようになります。

Symfony\Component\HttpFoundation\Request

public function vote(TokenInterface $token, $object, array $attributes)
{   
    print_r(get_class($object)); die();
    return VoterInterface::ACCESS_ABSTAIN;
}

私の投票者は、services.yml ファイルでサービスとして定義されています。

content_security.access.my_voter:
        class:      My\Bundle\Security\Authorization\Voter\MyVoter
        arguments:  ["@service_container"]
        public:     false
        tags:
            - { name: security.voter }

どこが間違っていますか?

アドバイスをいただければ幸いです。

ありがとう

4

1 に答える 1

8

何かが isGranted を呼び出すと、すべての登録された Voters が呼び出されます。

実際には、フレームワーク自体 (またはバンドル fe) がリクエストで isGranted を呼び出します。

オブジェクトがあなたが待っているものであるかどうかを確認するために、supportsClass、supportsAttribute、...を使用する必要があり、そうでない場合は VoterInterface::ABSTAIN 値を返します。

既存の実装 (フレームワーク自体 (RoleVoter など) 内) またはこちら: https://github.com/KnpLabs/KnpRadBundle/blob/develop/Security/Voter/IsOwnerVoter.php#L35-L45をご覧ください。

于 2013-07-17T21:12:14.067 に答える