Пользовательская проверка авторизации перед выполнением контроллера

Я добавил новую опцию roles в настройки маршрутизации для проверки разрешений для пунктов меню во время рендеринга меню.
Было бы здорово, если бы я мог использовать опцию для проверки авторизации перед выполнением соответствующих контроллеров.

Пример:

some_route:
    path: /path/
    defaults:   { _controller: MyBundle:Controller:action }
    option:
        roles: [ROLE_MANAGER, ROLE_ADMIN]

Мне нужно проверить, есть ли у пользователя доступ к контроллеру на основе его ролей перед запуском самого контроллера.
Как это возможно? Любые идеи?

ОБНОВЛЕНИЕ
Зачем мне нужна опция roles?
В проекте есть 4 разные роли и множество маршрутов. Некоторые маршруты защищены и видны только пользователям с определенными ролями.
Пока все проверки авторизации выполняются внутри контроллеров методом denyAccessUnlessGranted().
Я также использую KnpMenuBundle для построения меню. И во время рендеринга меню мне нужно проверить доступность каждого элемента для текущего вошедшего пользователя. Если у пользователя нет доступа к элементу, он исключается, и пользователь его не видит.
Чтобы проверить, есть ли у пользователя доступ к элементу, я добавил упомянутую мной опцию, где я определяю роли. которые имеют доступ к маршруту. И эти roles параметры определяют абсолютно те же роли, что и в чеках в denyAccessUnlessGranted(). И я думаю, раз у меня уже есть эти настройки ролей, почему бы не использовать их для проверки авторизации контроллера и убрать из них лишний код.


person Vasily    schedule 10.11.2015    source источник
comment
Можете ли вы объяснить, почему вы хотите это сделать?   -  person Frank B    schedule 10.11.2015
comment
@Frankbeen, я добавил некоторые пояснения в раздел «Обновление». Надеюсь, вы меня понимаете, если нет, то, пожалуйста, не стесняйтесь спрашивать подробности =)   -  person Vasily    schedule 10.11.2015
comment
Добавьте прослушиватель kernel.controller и проверьте там разрешения: symfony.com/ doc/current/reference/events.html#kernel-controller   -  person Cerad    schedule 10.11.2015
comment
@Cerad спасибо, это то, что я искал! Не могли бы вы добавить новый ответ и скопировать свой комментарий, чтобы я мог его принять.   -  person Vasily    schedule 10.11.2015


Ответы (2)


Я знаю, что это не очень хороший ответ, но вы просили об этом.

Добавьте прослушиватель kernel.controller и проверьте разрешения.

person Cerad    schedule 10.11.2015

В общем, два пути

  1. Security.yml

    - { path: ^/path/$, roles: [ROLE_MANAGER, ROLE_ADMIN] }
    
  2. Аннотации прямо в контроллер

    /**
     * @Security("has_role('ROLE_ADMIN') or has_role('ROLE_MANAGER')")
     */
    public function nameOfYourAction()
    

Таким образом, самым первым действием перед выполнением действия контроллера будет проверка безопасности: если это не удастся, контроллер не будет выполнен.

person DonCallisto    schedule 10.11.2015
comment
Спасибо, но на самом деле мне нужны эти параметры для проверки, имеет ли пользователь доступ к пунктам меню или нет во время рендеринга KnpMenu. Я добавил некоторые пояснения к этому вопросу. Если я определяю роли, имеющие доступ к контроллеру, с помощью аннотации @Security, то я не смогу получить эти настройки во время рендеринга меню... или смогу? - person Vasily; 10.11.2015
comment
@basil Я посмотрю, когда у меня будет свободное время, надеюсь, сегодня;) - person DonCallisto; 10.11.2015