Acceder al contenido principal

Blog

Volver a Blog

Operaciones al hacer Logout y Login en Symfony

07 Nov 017
login en symfony
Paco Morcillo

Symfony

En muchas ocasiones necesitaremos en nuestra aplicación desarrollada en Symfony hacer alguna operación después de que el usuario se haya deslogueado, como por ejemplo, registrarlo en el log de la aplicación. No es una operación complicada, pero sí que es más enrevesada de lo que puede parecer en un principio, aunque siguiendo estos sencillos pasos conseguirás sin problema ejecutar las operaciones que te demande la app al hacer logout.

Operaciones tras Logout en Symfony

Listener

1. El primer paso será crear un Listener para capturar el evento cuando se produzca, este Listener tendrá un constructor como cualquier otra clase de PHP, por si queremos inyectarle otros servicios como parámetro, por seguir con el mismo ejemplo, podemos inyectar el servicio en el que tenemos la función para insertar una nueva línea en log en la base de datos y de esta manera quedar reflejado si el usuario salió de la aplicación.

// LogoutListener.php
namespace AppBundle\Listeners;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Http\Logout\LogoutHandlerInterface;
use Slx\SystemlogBundle\DBAL\Types\LogactionsType;

class LogoutListener implements LogoutHandlerInterface {
    private $appLog;
    public function __construct($_applog){
        $this->appLog = $_appLog;
    }

    public function logout(Request $Request, Response $Response, TokenInterface $Token) {
        //TODO: Operaciones después del log
        $this->appLog->insertarLinea('Logout');
    }
}

Como aclaración, este listener será invocado cuando el usuario aún está en la cookie, aún tenemos acceso a los datos del usuario que había iniciado sesión, de esta manera Symfony puede saber qué usuario se está deslogueando, así podemos registrarlo en un log, o hacer diferentes operaciones en función del ROL que ostente dicho usuario.

Services.yml

2- Lo siguiente que haremos será, en nuestra hoja de servicios (services.yml), definir el listener como servicio y le inyectaremos el resto de servicios que necesite para hacer las operaciones pertinentes:

#src/AppBundle/Resources/config/services.yml
services:
    app.logoutlistener:
        class: AppBundle\Listeners\LogoutListener
        arguments: ["@app.log"]

Security.yml

3- Por último, tendremos que especificar en el security.yml el servicio que acabamos de definir para gestionar el logout. #app/config/security.yml
firewalls:
    logout:
        path: /logout
        target: / handlers: [app.logoutlistener]

 

Después de esto ya podemos iniciar sesión con un usuario en nuestra aplicación de Symfony, y después salir para comprobar que pasamos por la función logout que hemos escrito en el primer fragmento de código.

Acciones tras Login en Symfony

¿Se puede hacer esto mismo para el login? Sí, pero no podemos seguir estos pasos al 100%. Si queremos capturar el evento al iniciar sesión tendremos que hacer el primer paso, aunque la clase LoginListener será distinta y no heredará de ninguna otra.

// LoginListener.php
namespace AppBundle\Listeners;

use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Slx\SystemlogBundle\DBAL\Types\LogactionsType;

class LoginListener {

    private $appLog;

    public function __construct($_appLog){
        $this->appLog = $_appLog
    }

    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) {
        //TODO: Operaciones durante el Login
        $this->appLog->insertarLinea('Login');
    }
}

No tendremos que escribir en el security.yml de Symfony. Sencillamente, al definirlo como servicio con los siguientes parámetros será suficiente para poder ejecutar las operaciones que necesitamos hacer mientras un usuario inicia sesión.

#src/AppBundle/Resources/config/services.yml
services:
    app.loginlistener:
        class: AppBundle\Listeners\LoginListener
        arguments: ["@app.log"]
        tags: - { name: kernel.event_listener, event: security.interactive_login, method: onSecurityInteractiveLogin }

Cómo no hay una única manera de trabajar, en este post de Solucionex también puedes leer cómo hacer operaciones después de iniciar sesión en Symfony, en el que se utiliza la interfaz AuthenticationSuccessHandlerInterface para hacer una redirección después del login, algo bastante útil si vamos a enviar al usuario a secciones distintas de la aplicación dependiendo del rol que tenga asignado.

Esperemos haberte ahorrado algún dolor de cabeza siguiendo estos sencillos pasos en la app que estás desarrollando en Symfony.

Comentarios

Añadir nuevo comentario