Избиратель не работает в Symfony 3.3.4

У меня есть Voter, который отлично работает в контроллере, но когда я пытаюсь использовать его внутри службы, он всегда возвращает true, хотя у него есть оператор «return false».

Единственная разница, которую я вижу, это то, как я это называю.

В контроллере я использую это так:

    $this->denyAccessUnlessGranted('ver', $menu);

И в сервисе я называю это так:

    $this->authorizationChecker->isGranted('ver', $menu);

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

В «security.yml» у меня есть это:

    access_decision_manager:
        strategy: unanimous

Код избирателя:

    protected function voteOnAttribute($attribute, $subject, TokenInterface $token){

    $usuario = $token->getUser();

    if (!$usuario instanceof Usuarios) {
        return false;
    }

    /** @var Menu $menu */
    $menu = $subject;


    switch ($attribute) {
        case self::VER:
            return false;
        case self::EDITAR:
            return false;
        case self::IMPRIMIR:
            return false;
    }

    throw new \LogicException('This code should not be reached!');
}

Кто-нибудь может мне помочь?


person Angainor    schedule 01.08.2017    source источник
comment
Были проблемы с этим релизом, пробовали ли вы обновиться до 3.3.5?   -  person COil    schedule 01.08.2017
comment
Я просто обновляюсь (не знаю, была ли новая версия), но проблема не устранена :(   -  person Angainor    schedule 01.08.2017
comment
Я предполагаю, что вашего избирателя на самом деле не вызывают, хотя я не понимаю, почему. Может быть, добавить оператор die просто для проверки. Я предполагаю, что ваш избиратель правильно помечен.   -  person Cerad    schedule 01.08.2017
comment
Да, мой Избиратель называется. Я попытался поставить оператор die. И это работает при вызове из контроллера. Я не могу представить, что происходит.   -  person Angainor    schedule 02.08.2017
comment
При вызове из службы вы не используете консольную команду? И вы не вызываете его из конструктора службы? Может быть, показать соответствующие биты службы.   -  person Cerad    schedule 02.08.2017


Ответы (2)


Хорошо, я нашел ответ.

Разница между этим...:

    $this->denyAccessUnlessGranted('ver', $menu);

... и это ...:

    $this->authorizationChecker->isGranted('ver', $menu);

... так они информируют вас о результате.

Первый оператор генерирует исключение DenyAccessException, но второй оператор возвращает логическое значение (не генерировать исключение).

Я этого не осознавал :)

Спасибо за вашу помощь.

person Angainor    schedule 05.08.2017
comment
Избиратели не должны возвращать логические значения, а целые числа. Вы можете увидеть их в VoterInterface вместе с их константами: ACCESS_GRANTED (1), ACCESS_ABSTAIN (0) и ACCESS_DENIED (-1). Возврат логического значения приведет к тому, что последующая стратегия будет выполнять проверку на равенство с жонглированием типов, что может затруднить обнаружение проблем безопасности, если вы не знаете, что ищете. - person SteveB; 24.09.2018

    $this->denyAccessUnlessGranted('ver', $menu);

и

    $this->authorizationChecker->isGranted('ver', $menu);

будет делать ту же работу.

Пожалуйста, проверьте содержимое $menu как в сервисе, так и в контроллере.

$this->denyAccessUnlessGranted($attributes, $object = null, $message = 'Access Denied.') — это ярлык для $this->container->get('security.authorization_checker')->isGranted($attributes, $object)

Вашему пользовательскому избирателю необходимо реализовать VoterInterface или расширить Voter, что еще больше упрощает создание избирателя. Вы?

Проверьте официальный документ, чтобы проверить хорошую реализацию вашего избирателя. https://symfony.com/doc/current/security/voters.html

person numerogeek    schedule 01.08.2017
comment
Это должно быть то же самое, но оно не возвращает то же самое. My Voter расширяет Voter, и он отлично работает в контроллере, но плохо работает внутри службы. - person Angainor; 01.08.2017