Избиратель не работает в 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!');
}

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

1

Решение

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

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

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

… и это …:

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

… это способ, которым они информируют вас о результате.

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

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

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

1

Другие решения

    $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

0

По вопросам рекламы [email protected]