Symfony 2: Как мне проверить, не вошел ли пользователь в шаблон?

102

В шаблонах Symfony 2 (с использованием Twig), как я могу эффективно проверить, не вошел ли пользователь в систему?

Я не хочу использовать ROLEчеки. Мне нужен простой способ проверить, не вошел ли пользователь в систему.

Я знаю, что сравнивать app.user.usernameс anonработами, но мне это кажется неправильным.

Инструмент
источник

Ответы:

191

Вы можете проверить, установлен ли app.user.

 {% if app.user %}
    # user is logged in
 {% else %}
    # user is not logged in
 {% endif %}
Контрольная сумма
источник
17
Обратите внимание: если вы хотите проверить, НЕ вошел ли пользователь в систему, вы можете использовать:{% if not app.user %}
Mac_Cain13,
44
{% if is_granted('IS_AUTHENTICATED_FULLY') %}Вместо этого используйте . См. Документ Symfony2: symfony.com/doc/current/book/… . Также доступно для Silex: Silex.sensiolabs.org/doc/providers/…
Ронан
16
@Ronan {% if is_granted('IS_AUTHENTICATED_FULLY') %}вернет истину только в том случае, если пользователь прошел аутентификацию в текущем сеансе. Он вернет false, если пользователь аутентифицирован с помощью файла cookie «запомнить меня». Использование {% if app.user %}правильно, если нужно вернуть истину независимо от того, когда пользователь аутентифицирован.
RayOnAir
@Ronan, это не работает, поскольку приводит к следующей ошибке: Не найден провайдер аутентификации для токена класса «Symfony \ Component \ Security \ Core \ Authentication \ Token \ PreAuthenticatedToken».
Harold
{% if app.security.token is null or app.security.token.user == 'anon.' %}вот как у меня это сработало
Себастьян Г. Маринеску
98

Хотя текущий ответ отвечает на вопрос ОП, я хотел бы добавить более подробную информацию.

Я понимаю, что OP не хотел проверять роли, но я включаю их, чтобы другие пользователи SO могли копировать и вставлять их в будущем. - каждый раз, когда я гуглию, я оказываюсь здесь!

Источники документации Symfony:


Проверить, вошел ли в систему какой-либо пользователь (независимо от роли)

Как ответил, вы можете использовать , app.userчтобы проверить , если какой - либо пользователь вошел в систему .

{% if app.user %}
    # user is logged in (any and all users, regardless of ROLE_*)
{% elseif not app.user %}
    # user is not logged in (note the `not` in the `elseif` statement)
{% endif %}

Проверка статуса аутентификации

Вы можете использовать этот is_granted()метод для проверки ROLES(Ниже приведены все роли, назначенные Symfony, у вас также могут быть свои собственные роли (подробнее ниже) )

{% if is_granted('IS_AUTHENTICATED_FULLY') %}
    # This user entered their credentials THIS session
{% elseif is_granted('IS_AUTHENTICATED_REMEMBERED') %}
    # User logged in via a cookie (ie: Auth again before doing sensitive things)
{% elseif is_granted('IS_AUTHENTICATED_ANONYMOUSLY') %}
    # This is a `guest` or anonymous user
{% endif %}

из документов:

IS_AUTHENTICATED_ANONYMOUSLY - автоматически назначается пользователю, который находится в защищенной брандмауэром части сайта, но не вошел в систему. Это возможно только в том случае, если разрешен анонимный доступ.

IS_AUTHENTICATED_REMEMBERED - автоматически назначается пользователю, который прошел аутентификацию с помощью файла cookie «запомнить меня».

IS_AUTHENTICATED_FULLY - автоматически назначается пользователю, который предоставил свои данные для входа в текущий сеанс.


Проверка ролей

Вы также можете использовать is_granted()для проверки ролей.
Предположим , что мы имеем 3 роли ( ROLE_SUPER_ADMIN, ROLE_ADMIN, & ROLE_USER)

{% if is_granted('ROLE_SUPER_ADMIN') -%}
    # You're `ROLE_SUPER_ADMIN`
{% elseif is_granted('ROLE_ADMIN') -%}
    # You're `ROLE_ADMIN`
{% elseif is_granted('ROLE_USER') -%}
    # You're `ROLE_USER`
{% else %}
    # You're a `nobody` ;P
{%- endif %}

Выполнение вышеуказанного внутри контроллера

Просмотрите следующий ответ: Как проверить, вошел ли пользователь в Symfony2 внутри контроллера?

Анил
источник
2
Мне просто любопытно ... что -%}и {%-расшифровывается? почему бы %}и нет {%?
V-Light
11
-Удаляет все конечные пробелы так , что это более удобным для чтения в источнике исходного браузера. Подробнее здесь: twig.sensiolabs.org/doc/templates.html#whitespace-control
Анил,
Простите меня за то, что я снова вернул этот старый вопрос к жизни, но я думаю, что где-то читал, что app.user не будет нулевым для анонимных пользователей, не так ли? Разве это не означает, что проверки app.user недостаточно?
pzaj
@Anil symfony.com/doc/2.8/templating/app_variable.html второй описанный параметр выглядит app.userтак The value stored in this variable can be a UserInterface object, any other object which implements a __toString() method or even a regular string.. Я не помню, где я читал, что app.user возвращает «анон». строка к сожалению и при каких обстоятельствах.
pzaj
1
@ user1970395 Первая строка в прочитанной документации The representation of the current user or null if there is none., поэтому она будет пустой. Сторонний пакет может вернуть строку, если в его пользовательской UserInterfaceреализации есть __toString()метод, который вызывается при анонимности.
Анил