Проверка статуса пользователей в приложениях 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 %}