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();
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:
Tout ce que vous avez à faire est le même que le dernier. Vous pouvez y parvenir en appelant simplement:
$this->get('security.context')->setToken(null);
$this->get('request')->getSession()->invalidate();
$this->get('security.token_storage')->setToken(null);
$this->get('request')->getSession()->invalidate();
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
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.
:)
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();
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);
}