Symfony2: cómo iniciar sesión manualmente en el controlador?

Me gustaría hacer algo así en el controlador para cerrar la sesión del usuario:

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

El cierre de sesión en Symfony2 es manejado por el llamado controlador de cierre de sesión, que es solo un lister que se ejecuta cuando el patrón de coincidencia de URL desde la configuración de seguridad, es decir. si la URL es digamos /logout entonces este listener se ejecuta. Hay dos manejadores de cierre de sesión incorporados:

  1. CookieClearingLogoutHandler que simplemente borra todas las cookies.
  2. SessionLogoutHandler que invalida la sesión

Todo lo que tienes que hacer es lo mismo que el último. Puedes lograrlo simplemente llamando:

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(); 

Advertencia

Esto solo funcionará cuando la función recordarme esté deshabilitada. En otro caso, el usuario volverá a iniciar sesión mediante una cookie recordarme con la próxima solicitud.

Considere la solución extendida si está utilizando la función Recordarme: https://stackoverflow.com/a/28828377/1056679

Tenemos que configurar al usuario como un usuario anónimo al cerrar la sesión. Entonces podemos usar
$token->getUser()->getRoles(); en el controlador o {% if is_granted('ROLE_USER') %} en la plantilla {% if is_granted('ROLE_USER') %} .

 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(); 

La invalidación de la sesión del usuario puede causar algunos resultados no deseados. El firewall de Symfony tiene un oyente que verifica y actualiza el token del usuario siempre. Puede hacer un redireccionamiento a la ruta predeterminada de desconexión que ha especificado en su firewall.yml

En Controller puedes hacer esto:

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

si no conoce el nombre de la ruta de desconexión. Puedes verificarlo en la consola:

 app/console router:match /logout 

este comando le dará el nombre de la ruta que necesitará.

🙂

Si la funcionalidad de reminme está habilitada para su sitio, también debe limpiar la cookie de 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); }