Symfony 2: Jak mogę sprawdzić, czy użytkownik nie jest zalogowany w szablonie?

102

W szablonach Symfony 2 (przy użyciu Twig), jak mogę skutecznie sprawdzić, czy użytkownik nie jest zalogowany?

Nie chcę używać ROLEczeków. Chcę w prosty sposób sprawdzić, czy użytkownik nie jest zalogowany.

Jestem świadomy tego w porównaniu app.user.usernamez anonpracami, ale to po prostu nie wydaje mi się właściwe.

Narzędzie
źródło

Odpowiedzi:

191

Możesz sprawdzić, czy ustawiono app.user.

 {% if app.user %}
    # user is logged in
 {% else %}
    # user is not logged in
 {% endif %}
Suma kontrolna
źródło
17
Zauważ, że jeśli chcesz sprawdzić, czy użytkownik NIE jest zalogowany, możesz użyć:{% if not app.user %}
Mac_Cain13
44
Użyj {% if is_granted('IS_AUTHENTICATED_FULLY') %}zamiast tego. Zobacz dokumentację Symfony2: symfony.com/doc/current/book/… . Dostępne również dla Silex: silex.sensiolabs.org/doc/providers/…
Ronan
16
@Ronan {% if is_granted('IS_AUTHENTICATED_FULLY') %}zwróci wartość true tylko wtedy, gdy użytkownik uwierzytelnił się w bieżącej sesji. Zwróci wartość false, jeśli użytkownik uwierzytelniony za pomocą pliku cookie zapamiętaj mnie. Użycie {% if app.user %}jest poprawne, jeśli chce się zwrócić true niezależnie od tego, kiedy użytkownik został uwierzytelniony.
RayOnAir
@Ronan, to nie działa, ponieważ powoduje następujący błąd: Nie znaleziono dostawcy uwierzytelniania dla tokenu klasy „Symfony \ Component \ Security \ Core \ Authentication \ Token \ PreAuthenticatedToken”.
Harold
{% if app.security.token is null or app.security.token.user == 'anon.' %}tak to działało dla mnie
Sebastian G. Marinescu
98

Chociaż obecna odpowiedź odpowiada na pytanie PO, chciałbym dodać więcej szczegółów.

Rozumiem, że OP nie chciał sprawdzać ról, ale dołączam je, aby inni użytkownicy SO mogli kopiować i wklejać z tego w przyszłości. - za każdym razem, gdy to wyszukuję w Google, kończę tutaj!

Źródła dokumentów Symfony:


Sprawdź, czy zalogował się jakikolwiek użytkownik (niezależnie od roli)

Zgodnie z odpowiedzią możesz użyć, app.useraby sprawdzić, czy jakikolwiek użytkownik jest zalogowany.

{% 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 %}

Sprawdzanie statusu uwierzytelnienia

Możesz użyć is_granted()metody, aby sprawdzić ROLES, czy (poniżej są wszystkie role przypisane przez symfony, możesz też mieć swoje własne role (więcej poniżej) )

{% 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 %}

z dokumentów:

IS_AUTHENTICATED_ANONYMOUSLY - automatycznie przypisywane do użytkownika, który znajduje się w chronionej przez zaporę części witryny, ale nie jest zalogowany. Jest to możliwe tylko wtedy, gdy zezwolono na dostęp anonimowy.

IS_AUTHENTICATED_REMEMBERED - automatycznie przypisywane do użytkownika, który został uwierzytelniony za pomocą pliku cookie „zapamiętaj mnie”.

IS_AUTHENTICATED_FULLY - automatycznie przypisywane do użytkownika, który podał swoje dane logowania podczas bieżącej sesji.


Sprawdzanie ról

Możesz również użyć is_granted()do sprawdzenia ról.
Zakładając, że mamy 3 role ( ROLE_SUPER_ADMIN, ROLE_ADMIN, i 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 %}

Wykonanie powyższego wewnątrz kontrolera

Zobacz następującą odpowiedź: Jak sprawdzić, czy użytkownik jest zalogowany w Symfony2 wewnątrz kontrolera?

Indygowiec
źródło
2
Jestem po prostu ciekawy ... co -%}i co {%-oznacza? dlaczego nie %}i {%?
V-Light
11
-Usuwa wszystkie końcowe białe znaki tak, że to jest bardziej czytelny w kodzie źródłowym przeglądarki. Więcej informacji tutaj: twig.sensiolabs.org/doc/templates.html#whitespace-control
Anil
Wybaczcie, że ponownie uruchomiłem to stare pytanie, ale myślę, że przeczytałem gdzieś, że app.user nie będzie zerowy dla anonimowych użytkowników, prawda? Czy nie oznaczałoby to, że sprawdzenie pliku app.user nie jest wystarczające?
pzaj
@Anil symfony.com/doc/2.8/templating/app_variable.html Drugi opisany parametr jest app.usertaki The value stored in this variable can be a UserInterface object, any other object which implements a __toString() method or even a regular string.. Nie pamiętam, gdzie przeczytałem, że app.user zwraca „anon”. ciąg niestety iw jakich okolicznościach.
pzaj
1
@ user1970395 Pierwsza linia przeczytanych dokumentów The representation of the current user or null if there is none., więc będzie miała wartość null. Pakiet innej firmy może zwrócić ciąg, jeśli jego niestandardowa UserInterfaceimplementacja ma __toString()metodę, która jest wywoływana, gdy jest anonimowa.
Anil