Symfony2: Acceder al usuario logueado

En el artículo de hoy vamos a ver cómo recuperar el usuario conectado en la aplicación desde un controlador o servicio y en Twig. También veremos cómo comprobar si el usuario está conectado.

Lo primero que tenemos que tener bien configurado es la seguridad de la aplicación, esto está explicado en el manual de Symfony.

Acceder al usuario logueado

Desde el controlador, si extendemos de  Symfony\Bundle\FrameworkBundle\Controller\Controller tenemos acceso al método getUser (a partir de la versión 2.1 si no recuerdo mal), por lo que podemos llamar a este método y obtener el usuario.

Viendo el código de este método vamos a ver cómo podemos obtener el usuario en otros servicios:

Para obtener el usuario hay que acceder al servicio security.context, de ahí obtener el token y de ahí obtener el usuario, es decir:

Por lo que si desde un servicio queremos acceder al usuario, podemos inyectarle el servicio security.context y recuperarlo de ahí. Puede que según nuestra aplicación, necesitemos ejecutar o hacer comprobaciones cuando recuperamos el usuario, en ese caso se puede crear un servicio que sea el encargado de recuperar el usuario y hacer estas operaciones y será este servicio el que pasemos a los demás servicios para recuperar el usuario. Esto lo usaremos en uno de los próximos artículos.

Desde Twig podemos accedemos al usuario con:

app es una variable global disponible en cualquier plantilla.

Comprobar que el usuario está logueado

Desde un controller o servicio esta operación se hace también a través del security.context, lo que tenemos que hacer es comprobar si el usuario tiene un rol especial llamado IS_AUTHENTICATED_FULLYIS_AUTHENTICATED_REMEMBERED:

¿Cuál es la diferencia? El rol IS_AUTHENTICATED_FULLY requiere que estés logueado en esa misma sesión, esto es útil por ejemplo cuando se quiere acceder al perfil del usuario para que cambie la contraseña. El rol IS_AUTHENTICATED_REMEMBERED permite que estés autenticado mediante la cookie de rembember-me.

En Twig se puede comprobar lo mismo con la función is_granted: