У меня есть панель администратора, и я определил для нее роль 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!