Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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

Ответ 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 здесь Наслаждайтесь!