У меня есть панель администратора, и я определил для нее роль 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 }
Symfony 3.0 До Symfony 2.6 вы должны использовать SecurityContext .
SecurityContext будет устаревшим в Symfony 3.0 в пользу AuthorizationChecker .
Для Symfony 2.6+ и Symfony 3.0 используйте AuthorizationChecker .
if ($this->get('security.context')->isGranted('ROLE_ADMIN')) { # User is a ROLE_ADMIN }
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!