У меня есть 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!');
}
Кто-нибудь может мне помочь?
Хорошо, я нашел ответ.
Разница между этим …:
$this->denyAccessUnlessGranted('ver', $menu);
… и это …:
$this->authorizationChecker->isGranted('ver', $menu);
… это способ, которым они информируют вас о результате.
Первый оператор генерирует исключение DenyAccessException, но второй оператор возвращает логическое значение (не выбрасывать исключение).
Я не осознавал этого 🙂
Спасибо за вашу помощь.
$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