В моем приложении есть пять настраиваемых избирателей , и я использую стратегию « консенсус ».

Иногда мои избиратели не работают должным образом, и после отладки я нашел причину.

Стандартный Symfony RoleHierarchyVoter всегда возвращает «1», поэтому сумма результатов « предоставлено равна сумме результатов« отклонить ». Итак, мне нужно отключить этого избирателя, потому что я не использую RoleHierarchy.

1) Как отключить голосование в конфигурации?

2) Существует ли другое решение этой проблемы?

Большое спасибо за любую помощь!

ОБНОВЛЕНО .

Итак, я создал собственный RoleHierarchyVoter, который всегда возвращает false. Этот избиратель заменяет стандартного избирателя, но я не уверен, что это решение верное решение. Может еще какие решения?

6
Sergio Ivanuzzo 26 Окт 2015 в 16:06

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'] вернет истину.

Об этой проблеме сообщалось как об ошибке https://github.com/symfony/symfony/issues/16358

2
Sergio Ivanuzzo 4 Ноя 2015 в 09:52

В документации на 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 и добавлять дополнительную информацию в профилировщик. Таким образом, ваши собственные избиратели больше не будут черным ящиком.

0
Rvanlaak 29 Окт 2015 в 14:14