Как перезаписать раздел управления доступом с помощью @isGranted для метода контроллера в Symfony?

#symfony

#symfony

Вопрос:

Я использую Symfony 4.

У меня есть ^/admin только для роли ROLE_ADMIN . Однако мне нужно, чтобы некоторые страницы были доступны для других ролей. Например, я хочу /admin , чтобы and /admin/article был доступен для роли ROLE_ASSISTANT . Я начал с добавления @IsGranted("ROLE_ASSISTANT") в /admin/article метод контроллера. Но это не помогло. Я не могу найти никаких ресурсов о том, как перезаписать управление доступом security.yaml , но мне нужно. Мне не нужно открывать весь раздел администратора для помощника, всего пару страниц в admin.

Ответ №1:

Вам не нужно перезаписывать его с контроллера. Просто измените порядок access_control в вашей безопасности.файл yaml. Что-то вроде:

 access_control:
   - { path: ^/admin/article, roles: ROLE_ASSISTANT }
   - { path: ^/admin, roles: ROLE_ADMIN }
  

Комментарии:

1. Вопрос в том, как перезаписать access_controle с @IsGranted помощью . Я не хочу services.yaml переполняться множеством правил, трудных для понимания. Мой пример довольно упрощен, а реальный случай сложнее.

2. @FreeLightman брандмауэр уже заблокировал ваш запрос, прежде чем он дойдет до вас isGranted , если access_control он уже запрещает доступ. Так что это решение — ИМХО — наиболее подходящее. Альтернативой является разрешение access_control обеих ролей и фильтрация во всех соответствующих контроллерах / маршрутах, что, вероятно, более подвержено ошибкам.

3. Значит, это обычная практика использовать access_control и не использовать @IsGranted ? Я думал, что их можно объединить.

4. у @Jakumi есть причина. Можно использовать isGranted внутри вашего контроллера, но не совсем чистый. Контроллеру нужно просто получить запрос и отправить ответ. С другой стороны, компонент безопасности должен обрабатывать все, что касается безопасности, это называется «разделение проблем»

5. Документы объясняют access_control: symfony.com/doc/current/security/access_control.html Вы можете использовать isGranted для дальнейшего ограничения того, что пропускает access_control, но вы не можете его расширить. Если у вас более сложные правила и особые случаи, то, возможно, вам подойдет собственный слушатель запросов и, возможно, некоторые избиратели.