Новое в Symfony 5.1: Упрощенные атрибуты безопасности

Проверка статуса пользователей в приложениях Symfony (анонимных, вошедших в систему и т. д.) требует использования атрибутов безопасности, таких как IS_AUTHENTICATED_ANONYMOUSLY. Эти атрибуты иногда сбивают с толку, потому что они определяют не состояние, а условие. Например, IS_AUTHENTICATED_REMEMBERED верно для пользователей «Запомнить меня», но также и для полностью аутентифицированных пользователей.

Вот почему в Symfony 5.1 ввели новые атрибуты, которые только проверяют статус пользователя. Например, чтобы проверить внутри контроллера, является ли пользователь «Запомнить меня»:

// BEFORE
if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')
    && !$this->isGranted('IS_AUTHENTICATED_FULLY')) {
    // ...
}

// AFTER
if ($this->isGranted('IS_REMEMBERED')) {
    // ...
}

Другой пример, который проверяет анонимных пользователей внутри шаблонов Twig:

{# BEFORE #}
{% if is_granted('IS_AUTHENTICATED_ANONYMOUSLY')
    and not is_granted('IS_AUTHENTICATED_REMEMBERED')
    and not is_granted('IS_AUTHENTICATED_FULLY') %}
    {# ... #}
{% endif %}

{# AFTER #}
{% if is_granted('IS_ANONYMOUS') %}
    {# ... #}
{% endif %}

Новый атрибут олицетворения

Олицетворение пользователя позволяет просматривать приложение, вошедшее в систему как другой пользователь. При олицетворении других пользователей, вошедший в данный момент пользователь автоматически получает специальную роль безопасности ROLE_PREVIOUS_ADMIN. Вот как вы можете определить, является ли текущий пользователь олицетворением или нет.

Однако использование ролей безопасности в качестве атрибутов выглядит как хак, и, кроме того, имя роли не совсем понятно. Вот почему в Symfony 5.1 ROLE_PREVIOUS_ADMIN помечен как устаревший и ввели новый атрибут IS_IMPERSONATOR. Ваш код и шаблоны теперь будут намного легче понять:

{# BEFORE #}
{% if is_granted('ROLE_PREVIOUS_ADMIN') %}
    Exit impersonation
{% endif %}

{# AFTER #}
{% if is_granted('IS_IMPERSONATOR') %}
    Exit impersonation
{% endif %}