Symfony 2: Comment vérifier si un utilisateur n'est pas connecté à l'intérieur d'un modèle?

102

Dans les modèles Symfony 2 (utilisant Twig), comment puis-je vérifier efficacement si un utilisateur n'est pas connecté?

Je ne veux pas utiliser de ROLEchèques. Je veux un moyen simple de vérifier si un utilisateur n'est pas connecté.

Je suis conscient que comparer app.user.usernameavec des anonœuvres, mais cela ne me semble pas juste.

Outil
la source

Réponses:

191

Vous pouvez vérifier si app.user est défini.

 {% if app.user %}
    # user is logged in
 {% else %}
    # user is not logged in
 {% endif %}
Somme de contrôle
la source
17
Notez que si vous souhaitez vérifier si l'utilisateur n'est PAS connecté, vous pouvez utiliser:{% if not app.user %}
Mac_Cain13
44
Utilisez {% if is_granted('IS_AUTHENTICATED_FULLY') %}plutôt. Voir la documentation Symfony2 : symfony.com/doc/current/book/… . Également disponible pour Silex: silex.sensiolabs.org/doc/providers/…
Ronan
16
@Ronan {% if is_granted('IS_AUTHENTICATED_FULLY') %}ne retournera true que si l'utilisateur s'est authentifié dans la session en cours. Il retournera false si l'utilisateur s'est authentifié via un cookie Remember me. L'utilisation {% if app.user %}est correcte, si l'on veut retourner true quel que soit le moment où l'utilisateur s'est authentifié.
RayOnAir
@Ronan, cela ne fonctionne pas car cela entraîne l'erreur suivante: Aucun fournisseur d'authentification trouvé pour le jeton de la classe «Symfony \ Component \ Security \ Core \ Authentication \ Token \ PreAuthenticatedToken».
Harold
{% if app.security.token is null or app.security.token.user == 'anon.' %}c'est comme ça que je l'ai fait fonctionner pour moi
Sebastian G. Marinescu
98

Bien que la réponse actuelle réponde à la question du PO, j'aimerais ajouter plus de détails.

Je comprends que l'OP ne voulait pas vérifier les rôles, mais je les inclut afin que d'autres utilisateurs SO puissent copier et coller à partir de cela à l'avenir. - à chaque fois que je cherche sur Google, je me retrouve ici!

Sources de documentation Symfony:


Vérifiez si un utilisateur s'est connecté (quel que soit son rôle)

Comme répondu, vous pouvez utiliser app.userpour vérifier si un utilisateur est connecté.

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

Vérification de l'état d'authentification

Vous pouvez utiliser la is_granted()méthode pour vérifier ROLES, (ci-dessous sont tous les rôles attribués par symfony, vous pouvez également avoir vos propres rôles (plus ci-dessous) )

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

à partir de la documentation:

IS_AUTHENTICATED_ANONYMOUSLY - automatiquement attribué à un utilisateur qui se trouve dans une partie protégée par un pare-feu du site mais qui ne s'est pas réellement connecté. Ceci n'est possible que si l'accès anonyme a été autorisé.

IS_AUTHENTICATED_REMEMBERED - automatiquement attribué à un utilisateur authentifié via un cookie Remember me.

IS_AUTHENTICATED_FULLY - automatiquement attribué à un utilisateur qui a fourni ses informations de connexion au cours de la session en cours.


Vérification des rôles

Vous pouvez également utiliser is_granted()pour vérifier les rôles.
En supposant que nous avons 3 rôles ( ROLE_SUPER_ADMIN, ROLE_ADMIN, et 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 %}

Faire ce qui précède dans un contrôleur

Afficher la réponse suivante: Comment vérifier si un utilisateur est connecté à Symfony2 à l'intérieur d'un contrôleur?

Anil
la source
2
Je suis juste curieux ... quoi -%}et {%-représente? pourquoi pas %}et {%?
V-Light
11
Le -supprime tous les espaces à la fin afin qu'il soit plus lisible dans la source source du navigateur. Plus d'informations ici: twig.sensiolabs.org/doc/templates.html#whitespace-control
Anil
Pardonnez-moi d'avoir fait revivre cette vieille question, mais je pense avoir lu quelque part que app.user ne sera pas nul pour les utilisateurs anonymes, n'est-ce pas? Cela ne signifierait-il pas que vérifier app.user n'est pas suffisant?
pzaj
@Anil symfony.com/doc/2.8/templating/app_variable.html Le deuxième paramètre décrit est app.user, va comme ça The value stored in this variable can be a UserInterface object, any other object which implements a __toString() method or even a regular string.. Je ne me souviens pas où j'ai lu que app.user renvoie «anon». chaîne malheureusement et dans quelles circonstances.
pzaj
1
@ user1970395 La première ligne de la documentation lue The representation of the current user or null if there is none., elle sera donc nulle. Un bundle tiers peut renvoyer une chaîne si son UserInterfaceimplémentation personnalisée a une __toString()méthode qui est appelée lorsqu'elle est anonyme.
Anil