web-dev-qa-db-fra.com

Symfony2: comment déconnecter l'utilisateur manuellement dans le contrôleur?

je voudrais faire quelque chose comme ça dans le contrôleur pour déconnecter l'utilisateur:

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

La déconnexion dans Symfony2 est gérée par ce qu'on appelle un gestionnaire de déconnexion qui est juste un listeur qui est exécuté lorsque le modèle de correspondance d'URL de la configuration de sécurité, c'est-à-dire. si l'URL est disons /logout puis cet écouteur est exécuté. Il existe deux gestionnaires de déconnexion intégrés:

  1. CookieClearingLogoutHandler qui efface simplement tous les cookies.
  2. SessionLogoutHandler qui invalide la session

Tout ce que vous avez à faire est le même que le dernier. Vous pouvez y parvenir en appelant simplement:

Legacy Symfony

$this->get('security.context')->setToken(null);
$this->get('request')->getSession()->invalidate();

Symfony 2.6

$this->get('security.token_storage')->setToken(null);
$this->get('request')->getSession()->invalidate();

Avertissement

Cela ne fonctionnera que lorsque souvenez-vous de moi la fonctionnalité est désactivée. Dans les autres cas, l'utilisateur sera à nouveau connecté à l'aide d'un cookie de souvenir de moi à la prochaine demande.

Veuillez considérer la solution étendue si vous utilisez la fonctionnalité Se souvenir de moi: https://stackoverflow.com/a/28828377/1056679

75
Crozin

L'invalidation de la session utilisateur peut entraîner des résultats indésirables. Le pare-feu de Symfony dispose d'un écouteur qui vérifie et actualise toujours le jeton de l'utilisateur. Vous pouvez simplement faire une redirection vers la route de déconnexion par défaut que vous avez spécifiée dans votre firewall.yml

Dans le contrôleur, vous pouvez le faire:

$this->redirect( $this->generateUrl( 'your_logout_url' ) );

si vous ne connaissez pas le nom de l'itinéraire de déconnexion. Vous pouvez le vérifier dans la console:

app/console router:match /logout

cette commande vous donnera le nom de l'itinéraire dont vous aurez besoin.

:)

11
Francis Alvin

Nous devons définir l'utilisateur comme utilisateur anonyme lors de la déconnexion. Ensuite, nous pouvons utiliser
$token->getUser()->getRoles(); dans le contrôleur ou {% if is_granted('ROLE_USER') %} dans le modèle twig.

use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;
...
//$providerKey = $this->container->getParameter('fos_user.firewall_name');
$token = new AnonymousToken($providerKey, 'anon.');
$this->get('security.context')->setToken($token);
$this->get('request')->getSession()->invalidate();
9
Yasas Rangika

Si la fonctionnalité Rememberme est activée pour votre site, vous devez également nettoyer le cookie Rememberme:

    $this->get('security.context')->setToken(null);
    $this->get('request')->getSession()->invalidate();

    $response = new RedirectResponse($this->generateUrl('dn_send_me_the_bundle_confirm', array(
                'token' => $token
                )));
    // Clearing the cookies.
    $cookieNames = [
        $this->container->getParameter('session.name'),
        $this->container->getParameter('session.remember_me.name'),
    ];
    foreach ($cookieNames as $cookieName) {
        $response->headers->clearCookie($cookieName);
    }
1
pliashkou