Symfony 2: Як перевірити, чи користувач не увійшов до шаблону?


101

У шаблонах Symfony 2 (за допомогою Twig), як я можу ефективно перевірити, чи не входить користувач?

Я не хочу використовувати ROLEчеки. Я хочу прямолінійно перевірити, чи не входить користувач.

Я усвідомлюю, що порівнювати app.user.usernameз anonтворами, але це мені просто не вірно.

Відповіді:


190

Ви можете перевірити, чи встановлено 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') %}поверне значення true лише тоді, коли користувач пройшов автентифікацію в поточному сеансі. Він повернеться помилковим, якщо користувач отримав автентифікацію за допомогою файлу cookie запам'ятати мене. Використання {% if app.user %}правильно, якщо потрібно повернути істину незалежно від того, коли користувач пройшов автентифікацію.
RayOnAir

@Ronan, це не працює, оскільки це призводить до наступної помилки: Не знайдено постачальник аутентифікації для маркера класу "Symfony \ Component \ Security \ Core \ Authentication \ Token \ PreAuthenticationToken".
Гарольд

{% if app.security.token is null or app.security.token.user == 'anon.' %}ось так я зрозумів, що це працює для мене
Себастьян Г. Марінеску

98

Хоча нинішня відповідь відповідає на питання ОП, я хотів би додати більше деталей.

Я розумію, що ОП не хотіла перевіряти ролі, але я включаю їх, щоб інші користувачі 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 повертає "anon". на жаль, і за яких обставин.
pzaj

1
@ user1970395 Перший рядок у документах читається The representation of the current user or null if there is none., тому він буде нульовим. Пакет сторонніх розробників може повернути рядок, якщо в користувацькій UserInterfaceреалізації є __toString()метод, який викликається анонімним.
Аніль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.