我一直在阅读有关在Symfony 2中创建自定义选民的信息。根据this page,可以将对象传递给securitycontext的isGranted方法,我在自己的控制器中完成了这个方法: / p>
$page = new Page();
if ( ! $securityContext->isGranted('CONTENT_CREATE', $page)) {
throw new AccessDeniedException('Fail');
}
看起来投票方法应该接受它,但是,当我在$ object参数上调用get_class而不是获取我的Page实体时,我得到:
的Symfony \元器件\ HttpFoundation \请求
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 }
我哪里错了?
任何建议表示赞赏。
由于
答案 0 :(得分:8)
当调用isGranted时,会调用每个注册的选民。
事实是框架本身(或捆绑f.e)在请求中调用isGranted。
你必须使用supportsClass,supportsAttribute,...来检查对象是否是你正在等待的对象,如果没有返回VoterInterface :: ABSTAIN值。
查看现有的实现(在框架本身(如RoleVoter)或此处:https://github.com/KnpLabs/KnpRadBundle/blob/develop/Security/Voter/IsOwnerVoter.php#L35-L45