Esto es algo que muchas veces lo queremos hacer pero cuesta encontrar un poco de información clara al respecto. En este post veremos como crear un servicio para manejar el loginSuccess. 

Nota: Lo que voy a mostrar ahora, esta probado en Symfony 2.3 

Symfony permite en el security.yml indicarle a que url redirigir luego de un login exitoso, también se puede agregar la configuración en el formulario de login.

VEAMOS ALGO CÓDIGO:

Aqui vemos como en el security.yml el parámetro default_target_path contiene la ruta donde redireccionar luego del login. En este caso la ruta application_home debe estar ingresada en le routing.yml

firewalls:
    main:
        form_login:
            # ...
            default_target_path: application_home

La otra opción que tenemos es configurar este parámetro en el formulario de login html utilizando un input hidden

< input name="_target_path" type="hidden" value="user-dashboard" />

Pero ninguna de estas posibilidades nos ayudan cuando tenemos mas de un tipo de roles de usuario y necesitamos redireccionar a diferentes urls dependiendo del rol.

Por lo tanto debemos crear un servicio que sea llamado luego del login, esta tarea contiene tres pasos.

  1. Crear el servicio
  2. Registrar el servicio
  3. Configurar nuestro formulario de login

CREAR EL SERVICIO

Para esto vamos a la carpeta service que se encuentra dentro de src/AppBundle y creamos un nuevo archivo en mi, caso lo llame LoginSuccessHandler.php

Dentro agregamos el código de nuestro servicio

class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface
{
    protected $router, $security;
    
    public function __construct(Router $router, SecurityContext $security)
    {
        $this->router = $router;
        $this->security = $security;
    }
    
    public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    {
        # esta es mi ruta por defecto para un usuario
        $url = 'user-dashboard';
        if($this->security->isGranted('ROLE_ADMIN')) {
            # y en caso de que el usuario contenta el rol Admin
            # esta es la ruta donde quiero enviarlo
            $url = 'admin-dashboard';
        }
        $response = new RedirectResponse($this->router->generate($url));
            
        return $response;
    }
}

Listo con esto ya tenemos el servicio listo.


REGISTRAR EL SERVICIO

En este paso lo que vamos a hacer es decirle a Symfony que cuando llame a nuestro servicio lo haga a este archivo y con estos parámetros.

Modificamos nuestro archivo services.yml que se encuentra en la carpeta app/config,  agregando lo siguiente. Vamos a necesitar el security context para obtener el usuario logueado y sus roles y el router para obtener la url generada a partir de nuestra ruta.

services:
    # ...
    login_success_handler:
        class: AppBundle\Service\LoginSuccessHandler
        arguments: ['@router', '@security.context',]
        tags:
            - { name: 'monolog.logger', channel: 'security' }
    # ...

 CONFIGURAR NUESTRO FORMULARIO DE LOGIN

Con esto ya tenemos casi todo listo, solo falta indicarle al formulario que si el login es exitoso ejecute nuestro servicio y esto lo hacemos modificando el security.yml agregando nada mas que la siguiente linea.

# ...
form_login:
    login_path: /login
    check_path: /login_check
    ### le indicamos que debe usar nuestro servicio 
    success_handler: login_success_handler
    # ...

Ya podemos probar nuestro login!! :D.

Este servicio también podría servir si queremos validar si el usuario tiene alguna información incompleta y redirigirlo a diferentes páginas.

Espero que los ayude!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *