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 时,每个已注册的选民都会被调用。

事实是框架本身(或包 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 回答