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.