symfony - 将对象传递给自定义选民?

标签 symfony symfony-security

我一直在阅读有关在 Symfony 2 中创建自定义选民的信息。根据 this page , 可以将对象传递给 securitycontext 的 isGranted 方法,这是我在自己的 Controller 中完成的:

$page = new Page();

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

看起来 vote 方法应该接受它,但是,当我在 $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 }

我哪里错了?

感谢任何建议。

谢谢

最佳答案

当调用 isGranted 时,每个注册的选民都会被调用。

事实是框架本身(或 bundle f.e)根据请求调用 isGranted。

您必须使用 supportsClass、supportsAttribute ... 来检查对象是否是您正在等待的对象,如果不是,则返回 VoterInterface::ABSTAIN 值。

查看现有的实现(在框架本身(如 RoleVoter)中或此处:https://github.com/KnpLabs/KnpRadBundle/blob/develop/Security/Voter/IsOwnerVoter.php#L35-L45

关于symfony - 将对象传递给自定义选民?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17706428/

相关文章:

php - Doctrine2 ORM 不会刷新在脚本之外更改的对象

php - Symfony 强制登录并记住我

symfony - 使用一个登录表单对多个symfony2防火墙进行身份验证

php - 同一防火墙中的Symfony2认证方式

php - Symfony 安全注销未清除 RememberMe token

php - Symfony 表单 - 如何在验证时添加一些逻辑

javascript - Twig:评论在 {% javascripts %}

php - 我无法使用 querybuilder 在存储库中构建特定请求

php - Symfony 2 中表单范围的 error_bubbling?

php - 如何在 Symfony 中配置基本身份验证以允许空密码?