Symfony2如何禁用默认选民?

时间:2015-10-26 13:06:10

标签: symfony

我的应用程序中有五个自定义选民并使用策略“一致”。

有时我的选民不能正常工作,经过调试后我找到了原因。

标准的Symfony RoleHierarchyVoter始终返回“1”,因此“授予”的总和会将等于与“拒绝”结果的总和相加。所以,我需要禁用此选民,因为我不使用RoleHierarchy。

1)如何在配置中禁用选民?

2)是否存在此问题的另一种解决方案?

非常感谢您的帮助!

更新。

所以,我创建了自己的RoleHierarchyVoter,它总是返回false。 这个Voter取代了标准选民,但我不确定这个解决方案是否真实。 也许还有其他解决方案吗?

2 个答案:

答案 0 :(得分:2)

所以,目前我通过创建自己的RoleHierarchyVoter 解决了这个问题,返回false

目前无法删除标准RoleHierarchyVoter的定义,因为它以优先级TYPE_BEFORE_OPTIMIZATION注册并在我自己的编译器之前执行。

顺便说一下,您可以在 SecurityBundle / DependencyInjection / SecurityExtension.php 下一行找到:

private function createRoleHierarchy($config, ContainerBuilder $container)
    {
        if (!isset($config['role_hierarchy'])) {
            $container->removeDefinition('security.access.role_hierarchy_voter');

            return;
        }

        $container->setParameter('security.role_hierarchy.roles', $config['role_hierarchy']);
        $container->removeDefinition('security.access.simple_role_voter');
    }

即使我设置了role_hierarchy: ~isset($config['role_hierarchy']也会返回true。

此问题已报告为错误https://github.com/symfony/symfony/issues/16358

答案 1 :(得分:0)

RoleVoter的文档说:

RoleVoter votes if any attribute starts with a given prefix.

RoleVoter将检查的默认前缀是ROLE_,在构造函数中作为默认参数值传递。这些是必需的,因为选民必须检查当前登录的用户。

确保您自己的选民实施VoterInterface并检查选民对YourVoter::supportsClass的实施情况。应该在那里检查您想要知道用户有权访问的元素的FQN。那么以下配置就足够了:

app.security.download_voter:
    class:      AppBundle\Security\Voter\DownloadVoter
    public:     false
    tags:
        - { name: security.voter }

所以:

1)你不应该禁用这个选民,因为所有其他选民都依赖于此选民在通过投票时为当前用户创建的RoleHierarchy

2)为了更好地理解Voter,您可以让DIC在logger中注入voter,并向分析器添加额外信息。这样你自己的选民就不再是黑匣子了。