Symfony 2: Come posso verificare se un utente non è loggato all'interno di un template?


102

Nei template di Symfony 2 (usando Twig), come posso controllare efficacemente se un utente non è loggato?

Non voglio usare gli ROLEassegni. Voglio un modo semplice per verificare se un utente non ha effettuato l'accesso.

Sono consapevole che il confronto app.user.usernamecon le anonopere, ma non mi sembra giusto.

Risposte:


191

Puoi controllare se app.user è impostato.

 {% if app.user %}
    # user is logged in
 {% else %}
    # user is not logged in
 {% endif %}

17
Nota che se vuoi controllare se l'utente NON è loggato puoi usare:{% if not app.user %}
Mac_Cain13

44
Usa {% if is_granted('IS_AUTHENTICATED_FULLY') %}invece. Vedere il documento di Symfony2: symfony.com/doc/current/book/… . Disponibile anche per Silex: silex.sensiolabs.org/doc/providers/…
Ronan

16
@Ronan {% if is_granted('IS_AUTHENTICATED_FULLY') %}restituirà true solo se l'utente si è autenticato nella sessione corrente. Restituirà false se l'utente si è autenticato tramite un cookie ricordami. L'uso {% if app.user %}è corretto se si desidera restituire true indipendentemente da quando l'utente si è autenticato.
RayOnAir

@Ronan, ciò non funziona poiché restituisce il seguente errore: Nessun provider di autenticazione trovato per il token della classe "Symfony \ Component \ Security \ Core \ Authentication \ Token \ PreAuthenticatedToken".
Harold

{% if app.security.token is null or app.security.token.user == 'anon.' %}è così che ho funzionato per me
Sebastian G. Marinescu

98

Sebbene la risposta attuale risponda alla domanda del PO, vorrei aggiungere ulteriori dettagli.

Capisco che l'OP non volesse controllare i ruoli, ma li sto includendo in modo che altri utenti SO possano copiare e incollare da questo in futuro. - ogni volta che cerco su google, finisco qui!

Fonti di Symfony Doc:


Controlla se qualche utente ha effettuato l'accesso (indipendentemente dal ruolo)

Alla risposta, è possibile utilizzare app.userper verificare se un utente è connesso.

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

Verifica dello stato di autenticazione

Puoi usare il is_granted()metodo per controllare ROLES, (i seguenti sono tutti i ruoli assegnati da symfony, potresti anche avere i tuoi ruoli (più sotto) )

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

dai documenti:

IS_AUTHENTICATED_ANONYMOUSLY - assegnato automaticamente a un utente che si trova in una parte del sito protetta da firewall ma che non ha effettivamente effettuato l'accesso. Questo è possibile solo se è stato consentito l'accesso anonimo.

IS_AUTHENTICATED_REMEMBERED - assegnato automaticamente a un utente che è stato autenticato tramite un cookie ricordami.

IS_AUTHENTICATED_FULLY - assegnato automaticamente a un utente che ha fornito i propri dettagli di accesso durante la sessione corrente.


Controllo dei ruoli

Puoi anche usare is_granted()per verificare i ruoli.
Supponendo che abbiamo 3 ruoli ( ROLE_SUPER_ADMIN, ROLE_ADMIN, e 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 %}

Fare quanto sopra all'interno di un controller

Visualizza la seguente risposta: Come verificare se un utente è connesso a Symfony2 all'interno di un controller?


2
Sono solo curioso ... cosa -%}e {%-sta per? perché no %}e {%?
V-Light

11
Il -rimuove tutti gli spazi finali in modo che sia più leggibile nel codice sorgente del browser. Maggiori informazioni qui: twig.sensiolabs.org/doc/templates.html#whitespace-control
Anil

Perdonami per aver riportato in vita questa vecchia domanda, ma penso di aver letto da qualche parte che app.user non sarà nullo per gli utenti anonimi, non è corretto? Ciò non significherebbe che il controllo di app.user non è sufficiente?
pzaj

@Anil symfony.com/doc/2.8/templating/app_variable.html il secondo parametro descritto è app.user, andando così The value stored in this variable can be a UserInterface object, any other object which implements a __toString() method or even a regular string.. Non ricordo dove ho letto che app.user restituisce "anon". stringa purtroppo e in quali circostanze.
pzaj

1
@ user1970395 La prima riga nei documenti letta The representation of the current user or null if there is none., quindi sarà nulla. Un bundle di terze parti potrebbe restituire una stringa se la sua UserInterfaceimplementazione personalizzata ha un __toString()metodo che viene chiamato quando è anonimo.
Anil
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.