Symfony 5: @IsGranted для аннотации метода не работает для унаследованной роли - PullRequest
1 голос
/ 13 января 2020

Я (очевидно) искал похожих проблем , но у меня их нет.

Вот мой случай:

  • Я сделал кастом роль: ROLE_SUPER_ADMIN
  • Мой действительный пользователь admin, его единственная роль ROLE_SUPER_ADMIN
  • Роль ROLE_SUPER_ADMIN наследует ROLE_ADMIN (см. ниже)
  • Я пытаюсь получить доступ /users/page/1
  • Я получил Access Denied by controller annotation @IsGranted(["ROLE_ADMIN", "ROLE_RESPONSIBLE"])

Вот мой контроллер:

//src/Controller/UserController.php

/**
 * @Route("/users")
 * @IsGranted("ROLE_USER")
 */
class UserController extends AbstractController
{
    private $security;
    private $mailer;


    public function __construct(Security $security, MailerInterface $mailer)
    {
        $this->security = $security;
        $this->mailer = $mailer;
    }

    /**
     * @Route("/page/{!page}", name="user_index", requirements={"page"="\d+"}, defaults={"page":1})
     * @IsGranted({"ROLE_ADMIN", "ROLE_RESPONSIBLE"})
     */
    public function index(Request $request, UserRepository $userRepository, int $page = 1): Response
    {
[....]
}

И моя пользовательская иерархия ролей

config/packages/security.yaml

security:
    role_hierarchy:
        ROLE_RESPONSIBLE: ROLE_USER
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

Я дважды проверил каждый символ на случай, если у меня есть опечатка, я не ...

Я думал, что это было похоже на && оценку (пользователь должен был получить ROLE_ADMIN и ROLE_RESPONSIBLE).

РЕДАКТИРОВАТЬ: Это была проблема, поведение по умолчанию - && оценка каждой роли в массиве, мне нужно было использовать * @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_RESPONSIBLE')")

Я пытался только с @IsGranted("ROLE_USER"), он работал, но @IsGranted("ROLE_ADMIN") нет, и это унаследованная роль

Я (все еще) могу ' Не вставляйте изображение, поверьте мне на слово или посмотрите мои доказательства здесь

Tha НКС заранее, понедельник - это понедельник, ты знаешь ...

Ответы [ 2 ]

1 голос
/ 13 января 2020

Вы требуете, чтобы пользователю были предоставлены две роли. Измените свою иерархию, чтобы ROLE_SUPER_ADMIN наследовал ROLE_RESPONSIBLE, чтобы вы могли удалить ее или изменить аннотацию на:

/**
 * @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_RESPONSIBLE')")
 */
0 голосов
/ 13 января 2020

Я думаю, что вашему администратору тоже нужно иметь ROLE_RESPONSIBLE , поскольку вы предоставляете массив ролей в аннотации @isGranted (). /** * @Route("/page/{!page}", name="user_index", requirements={"page"="\d+"}, defaults={"page":1}) * @IsGranted({"ROLE_ADMIN", "ROLE_RESPONSIBLE"}) */ public function ...

...