Как проверить роль пользователя в symfony2 для URL-адресов, которые не подпадают под определенные шаблоны security.yml?
У меня есть панель администратора, и я определил для нее роль ROLE_ADMIN
. В моем файле security.yml я использую шаблон ^/admin/*
, поэтому каждая вещь под /admin требует ROLE_ADMIN
. Теперь в интерфейсе моего приложения мне нужно проверить роль пользователя, а если роль ROLE_ADMIN
отобразить один файл и в противном случае отобразить другой файл. Этот URL не попадает под шаблон, определенный в security.yml.
Итак, как я могу проверить, является ли пользователь администратором или обычным пользователем на домашней странице, который не подпадает под шаблон, определенный в security.yml?
Ответы
Ответ 1
Включить брандмауэр всего приложения с помощью шаблона ^/
, разрешить анонимный доступ и использовать 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
}
Ответ 2
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
Ответ 3
Вы находитесь в контроллере для страницы? Если это так, используйте метод isGranted
контекста безопасности: Контроль доступа для контроллеров
Ответ 4
Самое простое решение для этого - аннотации. Вместо этого:
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 look здесь Наслаждайтесь!