Symfony2, как отключить избиратель по умолчанию?

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

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

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

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

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

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

ОБНОВЛЕНО.

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


person Sergio Ivanuzzo    schedule 26.10.2015    source источник
comment
Вы можете просмотреть проходы компилятора symfony.com/doc/current/cookbook/service_container/ для полного удаления службы. Однако это похоже на странное поведение по умолчанию.   -  person Cerad    schedule 26.10.2015
comment
@Cerad, скажи мне, пожалуйста, может ли быть причиной этой проблемы то, что я установил FOSUserBundle?   -  person Sergio Ivanuzzo    schedule 26.10.2015
comment
Не знаю. Я не реализовал стратегию консенсуса. Я просто знаю, что вы можете использовать пропуск для изменения определений службы. И я держусь подальше от FOSUserBundle.   -  person Cerad    schedule 26.10.2015
comment
Я добавил это как отчет об ошибке github.com/symfony/symfony/issues/16358   -  person Sergio Ivanuzzo    schedule 28.10.2015
comment
Кстати, в настоящее время невозможно удалить определение RoleHierarchyVoter, потому что оно зарегистрировано с приоритетом TYPE_BEFORE_OPTIMIZATION и выполняется до моего компилятора.   -  person Sergio Ivanuzzo    schedule 28.10.2015


Ответы (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

person Sergio Ivanuzzo    schedule 28.10.2015

В документации RoleVoter говорится:

RoleVoter votes if any attribute starts with a given prefix.

Префикс по умолчанию, который будет проверять RoleVoter, равен ROLE_, который передается как значение параметра по умолчанию в конструкторе. Это необходимо, потому что избиратель должен проверить текущего вошедшего в систему пользователя.

Убедитесь, что ваши собственные избиратели реализуют VoterInterface, а также проверьте реализацию избирателем YourVoter::supportsClass. Полное доменное имя элемента, к которому вы хотите знать, что у пользователя есть доступ, должно быть проверено там. Тогда будет достаточно следующего конфига:

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

So:

1) Вы не должны отключать этого избирателя, потому что все остальные избиратели полагаются на RoleHierarchy, который этот избиратель создает для текущего пользователя при голосовании.

2) Для лучшего понимания Voter вы можете позволить DIC внедрить logger в ваш voter и добавить дополнительную информацию в профайлер. Таким образом, ваши собственные избиратели больше не будут черным ящиком.

person Rvanlaak    schedule 29.10.2015
comment
спасибо за ответ, но это что-то отличное от того, что я спросил. Причина, по которой я не могу отключить RoleHierarchyVoter, я описал в своем ответе на этот вопрос. - person Sergio Ivanuzzo; 29.10.2015
comment
Можете ли вы дать мне ссылку, где я могу прочитать, что все остальные избиратели полагаются на иерархию ролей...? - person Sergio Ivanuzzo; 29.10.2015
comment
User является обязательным параметром is_granted, поэтому RoleHierarchyVoter всегда должен выполняться первым. Что вы передаете в качестве второго аргумента is_granted? Это должен быть объект, реализующий UserInterface. - person Rvanlaak; 02.11.2015
comment
Все, что я передал desideManager, было правильным. Кстати, я решил проблему несколько дней назад, для этого мне пришлось изучить исходники SecurityBundle. Проблема заключалась в том, что когда я устанавливаю role_hierarchy: ~ в security.yml, условие isset($config['role_hierarchy']) все равно возвращает true, даже если оно содержит пустой массив. Это ошибка, я сообщил об этом. - person Sergio Ivanuzzo; 02.11.2015