Ищем метод can_access_route

Безопасность моего приложения Symfony 4 использует аннотации @security в контроллерах:

/**
 * @Route("/cat/list", name = "cat_list")
 *
 * @Security("is_granted('ROLE_XYZ'")
 */
public function listAction()
{
    // [...]
}

Я создаю меню с веточкой из списка имен маршрутов:

{% for route_name in ["cat_list","cat_map", ,"cat_trips"] %}
    <a href = "{{ path(route_name) }}"/> {{ route_name|trans }} </a>
{% endfor %}

Я хотел бы добавить проверку безопасности, чтобы отображать только маршруты, к которым у моего пользователя есть доступ, что-то вроде этого:

{% for route_name in ["cat_list","cat_map", ,"cat_trips"] %}
    {% if can_access_route(route_name) %}
        <a href = "{{ path(route_name) }}"/> {{ route_name|trans }} </a>
    {% endif %}
{% endfor %}

Есть ли что-нибудь для этого в Symfony? Или как бы вы построили is_route_granted ()?

route не предоставляется. ROLE предоставляется. Если пользователь предоставил ROLE - он может получить доступ к route.
u_mulder 25.05.2018 16:03

Так почему бы не использовать тот же подход в Twig? Проверьте РОЛЬ пользователя и покажите или нет какую-либо ссылку (или только часть меню), но для лучшей реализации вам следует взглянуть на KnpMenuBundle.

gp_sflover 25.05.2018 16:13

также вы можете использовать избиратель, чтобы проверить свои условия. см. symfony.com/doc/current/security/voters.html

LeshaZ 25.05.2018 16:13

Избиратели или роли используют один и тот же метод isGranted (), это не изменит эту конкретную проблему проверки безопасности доступа извне действия. is_route_granted ("route_name") может быть не лучшим именем, скажем, оно будет называться can_access_route ("route_name")

Wink 25.05.2018 16:22

вы можете поместить свою логику доступа, например, в метод избирателя canSee. затем в ветке просто проверьте {% if is_granted (constant (Voter :: SEE), user)%}, посмотрите на настраиваемого избирателя, чтобы получить более подробную информацию

LeshaZ 25.05.2018 16:34

мне жаль. Вместо пользователя будет маршрут и пользователь попадет в избиратель из токена.

LeshaZ 25.05.2018 16:45

@LeshaZ В моем последнем блоке кода, как бы вы получили «константа (Voter :: SEE), пользователь» в цикле for (он разный для каждого маршрута, у меня много маршрутов)? Логику легко переписать вручную, но было бы лучше извлечь ее из аннотации @ Security, написанной в первом блоке кода.

Wink 25.05.2018 16:54

@Wink В вашем избирателе должен быть массив (постоянная или статическая переменная) с маршрутами в качестве значения и в качестве ключа - ваше имя пользователя или роль или что-то еще, что зависит от каждого пользователя. Затем вы вызываете is_granted (constant ('My \ Super \ Namespace \ Voter :: CAN_SEE'), each_route_in_the_loop), а затем в voter вы можете проверить это, например, return in_array ($ each_route_in_the_loop, self :: MY_ROUTES [$ token-> getUser () -> getRole ()] CAN_SEE должен содержать метод в виде строки.Посмотрите более внимательно на voteOnAttribute.

LeshaZ 26.05.2018 12:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
8
35
0

Другие вопросы по теме