web-dev-qa-db-fra.com

Comment vérifier si un utilisateur est connecté à Symfony2 dans un contrôleur?

J'ai lu ici comment vérifier le statut de connexion d'un utilisateur en utilisant un modèle twig pour un site Web basé sur Symfony2. Cependant, je dois savoir comment vérifier si L'utilisateur est connecté depuis un contrôleur. J'étais assez sûr que le code suivant était correct:

$user = $this->get('security.context')->getToken()->getUser();

mais il retourne toujours quelque chose, par exemple un utilisateur connecté ou un utilisateur anonyme.

Une idée? Merci d'avance.

72
JeanValjean

Avertissement : La vérification de 'IS_AUTHENTICATED_FULLY' Seul renverra la valeur false si l'utilisateur s'est connecté à l'aide de la fonctionnalité "Mémoriser mes informations".

Selon la documentation Symfony 2, il existe 3 possibilités:

IS_AUTHENTICATED_ANONYMOUSLY - attribué automatiquement à un utilisateur appartenant à une partie du site protégée par un pare-feu mais ne s'étant pas connecté (e). Ceci n'est possible que si l'accès est anonyme a été autorisé.

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

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

Ces rôles représentent trois niveaux d'authentification:

Si vous avez le rôle IS_AUTHENTICATED_REMEMBERED, Vous avez également le rôle IS_AUTHENTICATED_ANONYMOUSLY. Si vous avez le rôle IS_AUTHENTICATED_FULLY, Vous avez également les deux autres rôles. En d'autres termes, ces rôles représentent trois niveaux d'augmentation de la "force" de l'authentification.

J'ai rencontré un problème où les utilisateurs de notre système qui utilisaient la fonctionnalité "Remember Me" étaient traités comme s'ils ne s'étaient pas connectés du tout sur des pages qui ne vérifiaient que 'IS_AUTHENTICATED_FULLY'.

La solution consiste alors à leur demander de se reconnecter s’ils ne sont pas complètement authentifiés ou de vérifier le rôle mémorisé:

$securityContext = $this->container->get('security.authorization_checker');
if ($securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
    // authenticated REMEMBERED, FULLY will imply REMEMBERED (NON anonymous)
}

J'espère que cela évitera à quelqu'un de commettre la même erreur que moi. J'ai utilisé ce billet comme référence pour vérifier si quelqu'un était connecté ou non à Symfony 2.

Source: http://symfony.com/doc/2.3/cookbook/security/remember_me.html#forcing-the-user-to-re-authenticate-before-accessing-certain-resources

148
Bryson

SecurityContext sera obsolète dans Symfony 3.0

Antérieur à Symfony 2.6 vous utiliseriez SecurityContext.
SecurityContext sera obsolète dans Symfony 3.0 en faveur de AuthorizationChecker .

Pour Symfony 2.6+ & Symfony 3.0 use AuthorizationChecker .


Symfony 2.6 (et inférieur)

// Get our Security Context Object - [deprecated in 3.0]
$security_context = $this->get('security.context');
# e.g: $security_context->isGranted('ROLE_ADMIN');

// Get our Token (representing the currently logged in user)
$security_token = $security_context->getToken();
# e.g: $security_token->getUser();
# e.g: $security_token->isAuthenticated();
# [Careful]             ^ "Anonymous users are technically authenticated"

// Get our user from that security_token
$user = $security_token->getUser();
# e.g: $user->getEmail(); $user->isSuperAdmin(); $user->hasRole();

// Check for Roles on the $security_context
$isRoleAdmin = $security_context->isGranted('ROLE_ADMIN');
# e.g: (bool) true/false

Symfony 3.0+ (et à partir de Symfony 2.6+)

security.context devient security.authorization_checker.
Nous avons maintenant notre jeton de security.token_storage à la place du security.context

// [New 3.0] Get our "authorization_checker" Object
$auth_checker = $this->get('security.authorization_checker');
# e.g: $auth_checker->isGranted('ROLE_ADMIN');

// Get our Token (representing the currently logged in user)
// [New 3.0] Get the `token_storage` object (instead of calling upon `security.context`)
$token = $this->get('security.token_storage')->getToken();
# e.g: $token->getUser();
# e.g: $token->isAuthenticated();
# [Careful]            ^ "Anonymous users are technically authenticated"

// Get our user from that token
$user = $token->getUser();
# e.g (w/ FOSUserBundle): $user->getEmail(); $user->isSuperAdmin(); $user->hasRole();

// [New 3.0] Check for Roles on the $auth_checker
$isRoleAdmin = $auth_checker->isGranted('ROLE_ADMIN');
// e.g: (bool) true/false

Lisez plus ici dans la documentation: AuthorizationChecker
Comment faire cela dans twig ?: Symfony 2: Comment puis-je vérifier si un utilisateur n'est pas connecté à l'intérieur d'un modèle?

53
Anil

Essaye ça:

if( $this->container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY') ){
    // authenticated (NON anonymous)
}

Informations complémentaires:

"Les utilisateurs anonymes sont techniquement authentifiés, ce qui signifie que la méthode isAuthenticated () d'un objet utilisateur anonyme renvoie la valeur true. Pour vérifier si votre utilisateur est réellement authentifié, recherchez le rôle IS_AUTHENTICATED_FULLY."

Source: http://symfony.com/doc/current/book/security.html

46
Lorenzo Marcon

Si vous utilisez une annotation de sécurité à partir de SensioFrameworkExtraBundle, vous pouvez utiliser quelques expressions (définies dans \Symfony\Component\Security\Core\Authorization\ExpressionLanguageProvider):

  • @Security("is_authenticated()"): pour vérifier que l'utilisateur est autorisé et non anonyme
  • @Security("is_anonymous()"): pour vérifier si l'utilisateur actuel est l'utilisateur anonyme
  • @Security("is_fully_authenticated()"): équivalent à is_granted('IS_AUTHENTICATED_FULLY')
  • @Security("is_remember_me()"): équivalent à is_granted('IS_AUTHENTICATED_REMEMBERED')
7
magnetik

Si vous utilisez des rôles, vous pouvez vérifier ROLE_USER c'est la solution que j'utilise:

if (TRUE === $this->get('security.authorization_checker')->isGranted('ROLE_USER')) {
    // user is logged in
} 
6
Redwan Abbs

Pour ajouter à la réponse donnée par Anil, dans symfony, vous pouvez utiliser $this->getUser() pour déterminer si l'utilisateur est connecté, une condition simple telle que if(!$this->getUser()) {} fera .

Si vous regardez le code source disponible dans le contrôleur de base, il fait exactement la même chose que celle définie par Anil.

5
Ibrahim Azhar Armar