2015-10-26 3 views
5

У меня есть пять пользовательских избирателей в моей стратегии применения и использования "Консенсус".Symfony2 как отключить избирателя по умолчанию?

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

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

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

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

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

ОБНОВЛЕНО.

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

+1

Чтобы полностью удалить сервис, вы можете просмотреть его в http://symfony.com/doc/current/cookbook/service_container/compiler_passes.html. Похоже, это странное поведение по умолчанию. – Cerad

+0

@ Cerad скажите, пожалуйста, может быть причиной этой проблемы, что я установил FOSUserBundle? –

+0

Не знаю. Я не реализовал консенсусную стратегию. Я просто знаю, что вы можете использовать проход для изменения определений служб. И я остаюсь далеко от FOSUserBundle. – Cerad

ответ

2

Таким образом, в настоящее время я решил эту проблему, создав собственный RoleHierarchyVoter, который всегда возвращение ложных.

В настоящее время невозможно удалить определение стандартного RoleHierarchyVoter, поскольку оно зарегистрировано с приоритетом TYPE_BEFORE_OPTIMIZATION и выполнено перед моим собственным компилятором.

Btw, вы можете найти в SecurityBundle/внедрение зависимости/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

0

Документация по RoleVoter говорит:

RoleVoter votes if any attribute starts with a given prefix. 

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

Убедитесь, что ваши избиратели реализуют 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

спасибо за ответ, но это нечто отличное от того, что я спросил. Причина, почему я не могу отключить RoleHierarchyVoter, описанную в моем ответе на этот вопрос. –

+0

Можете ли вы дать мне ссылку, откуда я могу прочитать, что «все остальные избиратели полагаются на RoleHierarchy ...»? –

+0

«Пользователь» является обязательным параметром 'is_granted', поэтому причина' RoleHierarchyVoter' всегда должна выполняться в первую очередь. Что вы передаете как второй аргумент 'is_granted'? Это должен быть объект, который реализует 'UserInterface'. – Rvanlaak

Смежные вопросы