Symfony 2: ¿Cómo verifico si un usuario no está conectado dentro de una plantilla?

101

En las plantillas de Symfony 2 (usando Twig), ¿cómo puedo verificar efectivamente si un usuario no está conectado?

No quiero usar ROLEcheques. Quiero una forma sencilla de comprobar si un usuario no ha iniciado sesión.

Soy consciente de que comparar app.user.usernamecon anonfunciona, pero eso no me parece correcto.

Herramienta
fuente

Respuestas:

190

Puede comprobar si app.user está configurado.

 {% if app.user %}
    # user is logged in
 {% else %}
    # user is not logged in
 {% endif %}
Suma de comprobación
fuente
17
Tenga en cuenta que si desea verificar si el usuario NO ha iniciado sesión, puede usar:{% if not app.user %}
Mac_Cain13
44
Úselo en su {% if is_granted('IS_AUTHENTICATED_FULLY') %}lugar. Consulte el documento de Symfony2: symfony.com/doc/current/book/… . También disponible para Silex: silex.sensiolabs.org/doc/providers/…
Ronan
16
@Ronan {% if is_granted('IS_AUTHENTICATED_FULLY') %}solo devolverá verdadero si el usuario se ha autenticado en la sesión actual. Devolverá falso si el usuario se autenticó mediante una cookie de recordarme. El uso {% if app.user %}es correcto, si se quiere devolver verdadero independientemente de cuándo se autenticó el usuario.
RayOnAir
@Ronan, eso no funciona porque da como resultado el siguiente error: No se encontró un proveedor de autenticación para el token de la clase "Symfony \ Component \ Security \ Core \ Authentication \ Token \ PreAuthenticatedToken".
Harold
{% if app.security.token is null or app.security.token.user == 'anon.' %}así es como lo hice funcionar para mí
Sebastian G. Marinescu
98

Aunque la respuesta actual responde a la pregunta del OP, me gustaría agregar más detalles.

Entiendo que el OP no quería verificar los roles, pero los incluyo para que otros usuarios de SO puedan copiar y pegar de esto en el futuro. - ¡Cada vez que busco esto en Google, termino aquí!

Fuentes de Symfony Doc:


Compruebe si algún usuario inició sesión (independientemente del rol)

Como respondió, puede usar app.userpara verificar si algún usuario ha iniciado sesión.

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

Comprobación del estado de autenticación

Puedes usar el is_granted()método para verificar ROLES(los siguientes son todos los roles asignados por Symfony, también puedes tener tus propios roles (más abajo) )

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

de los documentos:

IS_AUTHENTICATED_ANONYMOUSLY: asignado automáticamente a un usuario que se encuentra en una parte del sitio protegida por firewall pero que no ha iniciado sesión. Esto solo es posible si se ha permitido el acceso anónimo.

IS_AUTHENTICATED_REMEMBERED: asignado automáticamente a un usuario que se autenticó mediante una cookie de recordarme.

IS_AUTHENTICATED_FULLY: se asigna automáticamente a un usuario que ha proporcionado sus datos de inicio de sesión durante la sesión actual.


Comprobación de roles

También puede usarlo is_granted()para verificar roles.
Suponiendo que tenemos 3 funciones ( ROLE_SUPER_ADMIN, ROLE_ADMIN, y 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 %}

Haciendo lo anterior dentro de un controlador

Vea la siguiente respuesta: ¿Cómo verificar si un usuario está conectado a Symfony2 dentro de un controlador?

Añil
fuente
2
Solo tengo curiosidad ... ¿qué -%}y qué {%-significa? por qué no %}, y {%?
V-Light
11
El -Elimina todos los espacios en blanco para que sea más fácil de leer en la fuente de origen del navegador. Más información aquí: twig.sensiolabs.org/doc/templates.html#whitespace-control
Anil
Perdóname por volver a vivir esta vieja pregunta, pero creo que leí en alguna parte que app.user no será nulo para usuarios anónimos, ¿no es así? ¿No significa eso que comprobar app.user no es suficiente?
pzaj
@Anil symfony.com/doc/2.8/templating/app_variable.html El segundo parámetro descrito es app.user, así The value stored in this variable can be a UserInterface object, any other object which implements a __toString() method or even a regular string.. No recuerdo dónde leí esa aplicación. El usuario devuelve "anon". cadena lamentablemente y en qué circunstancias.
pzaj
1
@ user1970395 Se lee la primera línea de los documentos The representation of the current user or null if there is none., por lo que será nula. Un paquete de terceros podría devolver una cadena si su UserInterfaceimplementación personalizada tiene un __toString()método que se llama cuando es anónimo.
Anil