Blog


Redirigir al iniciar sesión en Symfony2 usando handlers

REDIRIGIR AL INICIAR SESIÓN EN SYMFONY2 USANDO HANDLERS

08 / 05 / 2014 Symfony

Si buscas la forma de realizar acciones después de que un usuario se autentique correctamente en tu aplicación Symfony, aquí puedes encontrar una solución. En este artículo vamos a ver cómo realizar una redirección al iniciar sesión, dependiendo del role del usuario que se autentica, mediante el uso de un login handler que será ejecutado cuando el login del usuario sea correcto.

Lo primero que tendremos que hacer será definir el servicio en el fichero services.yml de nuestro bundle:


parameters:
    vabadus_user_security.handler.login_success_handler.class: Vabadus\AdminBundle\Service\LoginSuccessHandler

services:
    vabadus_user_security.handler.login_success_handler:
        class: %vabadus_user_security.handler.login_success_handler.class%
        arguments: [@router, @security.context]

Y una vez definido el servicio, definimos el handler. Crearemos nuestra clase LoginSuccessHandler en la carpeta Service de nuestro bundle. Como hemos visto en la definición del servicio, necesitamos inyectar el componente Router y SecurityContext que usaremos para realizar las acciones oportunas después del login del usuario.


<?php

namespace Vabadus\AdminBundle\Service;

use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Router;

class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface
{
    protected $router;
    protected $security;

    public function __construct(Router $router, SecurityContext $security)
    {
        $this->router   = $router;
        $this->security = $security;
    }

    public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    {
        $user = $this->security->getToken()->getUser();

        if ($this->security->isGranted('ROLE_ADMIN')) {
            $response = new RedirectResponse($this->router->generate('listado_usuarios'));
        }
        elseif ($this->security->isGranted('ROLE_USER')) {
            $response = new RedirectResponse($this->router->generate('mis_datos'));
        }

        return $response;
    }
}

Por tanto, cuando es llamado el método onAuthenticationSuccess en nuestro LoginSuccessHandler, una vez que el usuario se ha logado correctamente, comprobamos el role del usuario a través del Security Context y realizamos la redirección correspondiente, dependiendo si el usuario cuenta con ROLE_ADMIN o ROLE_USER.

Lo último que tendremos que hacer es actualizar la configuración del security.yml de nuestra aplicación para que use el handler que acabamos de definir, de la siguiente manera:


security:
    # . . .

    firewalls:
        main:
            # . . .
            form_login:
                # . . .
                success_handler: vabadus_user_security.handler.login_success_handler
            # . . .

    access_control:
        # . . .

En este ejemplo mostramos cómo realizar acciones después de iniciar sesión, pero de la misma forma podríamos aplicarlo en el logout de un usuario, en un login fallido, etc.



ARTÍCULOS RELACIONADOS