Безопасность моего приложения 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 ()?
Так почему бы не использовать тот же подход в Twig? Проверьте РОЛЬ пользователя и покажите или нет какую-либо ссылку (или только часть меню), но для лучшей реализации вам следует взглянуть на KnpMenuBundle.
также вы можете использовать избиратель, чтобы проверить свои условия. см. symfony.com/doc/current/security/voters.html
Избиратели или роли используют один и тот же метод isGranted (), это не изменит эту конкретную проблему проверки безопасности доступа извне действия. is_route_granted ("route_name") может быть не лучшим именем, скажем, оно будет называться can_access_route ("route_name")
вы можете поместить свою логику доступа, например, в метод избирателя canSee. затем в ветке просто проверьте {% if is_granted (constant (Voter :: SEE), user)%}, посмотрите на настраиваемого избирателя, чтобы получить более подробную информацию
мне жаль. Вместо пользователя будет маршрут и пользователь попадет в избиратель из токена.
@LeshaZ В моем последнем блоке кода, как бы вы получили «константа (Voter :: SEE), пользователь» в цикле for (он разный для каждого маршрута, у меня много маршрутов)? Логику легко переписать вручную, но было бы лучше извлечь ее из аннотации @ Security, написанной в первом блоке кода.
@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.






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