Как проверить роль пользователя в symfony2 для URL-адресов, которые не подпадают под определенные шаблоны security.yml?

У меня есть панель администратора, и я определил для нее роль ROLE_ADMIN . В моем файле security.yml я использую шаблон ^/admin/* поэтому каждая вещь под / admin требует ROLE_ADMIN . Теперь в интерфейсе моего приложения мне нужно проверить роль пользователя, и если роль ROLE_ADMIN отображает один файл и в противном случае отображает другой файл. Этот URL не подпадает под шаблон, определенный в security.yml.

Итак, как я могу проверить, является ли пользователь администратором или обычным пользователем на домашней странице, которая не подпадает под шаблон, определенный в security.yml?

Включите брандмауэр всего приложения, используя шаблон ^/ , разрешите анонимный доступ и используйте access_control для ограничения доступа:

 security: firewalls: secured_area: pattern: ^/ anonymous: ~ access_control: - { path: ^/admin, roles: ROLE_ADMIN } 

Как предложил @itsmequinn, используйте метод isGranted() контекста безопасности:

 if ($this->get('security.context')->isGranted('ROLE_BRAND')) { // the user has the ROLE_BRAND role, so act accordingly } 

В Symfony 2.6 security.context был разделен на две отдельные службы. Следовательно, для решения проблемы необходимо использовать службу security.authorization_checker :

 if ($this->get('security.authorization_checker')->isGranted('ROLE_BRAND')) { // the user has the ROLE_BRAND role, so act accordingly } 

SecurityContext будет устаревшим в Symfony 3.0

До Symfony 2.6 вы должны использовать SecurityContext .
SecurityContext будет устаревшим в Symfony 3.0 в пользу AuthorizationChecker .

Для Symfony 2.6+ и Symfony 3.0 используйте AuthorizationChecker .


Symfony 2.5 (и ниже)

 if ($this->get('security.context')->isGranted('ROLE_ADMIN')) { # User is a ROLE_ADMIN } 

Symfony 2.6 (и выше)

 if ($this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) { # User is a ROLE_ADMIN } 

Аналогичный вопрос: как проверить, зарегистрирован ли пользователь в Symfony2 внутри контроллера?

Подробнее о документах читайте здесь: AuthorizationChecker

Вы находитесь в контроллере для страницы? Если это так, используйте метод isGranted контекста безопасности: средства контроля доступа для контроллеров

Самое простое решение для этого – аннотации. Вместо этого:

  if ($this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) { # User is a ROLE_ADMIN } 

.. попробуйте использовать это:

 /** * ... * @Security("has_role('ROLE_ADMIN')") */ 

.. или :

 /** * ... * @Security("is_granted('POST_ADD', post)") */ public function addAction(Post $post){...} 

Здесь вы можете узнать больше об аннотациях безопасности . Аннотации – лучшая практика в Symfony 2 смотрите здесь Enjoy!