Symfony 2 & FOSUSERBUNDLE: autenticar al usuario después de restablecer la contraseña
-
13-12-2019 - |
Pregunta
Al anular el controlador de contraseña de restablecimiento de Fosuserbundle, existe una llamada a la llamada al método "autenticateuser" (línea 104):
....
$this->authenticateUser($user);
....
Mi problema es que ya anuleo el manejador de autenticación de Symfony y tengo mi propia lógica cuando un usuario inicia sesión.
editar Aquí está mi controlador de autenticación:
<?php
/* ... all includes ... */
class AuthenticationHandler implements AuthenticationSuccessHandlerInterface, LogoutSuccessHandlerInterface
{
private $router;
private $container;
public function __construct(Router $router, ContainerInterface $container)
{
$this->router = $router;
$this->container = $container;
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
// retrieve user and session id
$user = $token->getUser();
/* ... here I do things in database when logging in, and dont want to write it again and again ... */
// prepare redirection URL
if($targetPath = $request->getSession()->get('_security.target_path')) {
$url = $targetPath;
}
else {
$url = $this->router->generate('my_route');
}
return new RedirectResponse($url);
}
}
Entonces, ¿cómo podría llamar al método "Onauthenticationsccess" desde mi controlador de autenticación en el reinicioController? Para evitar reescribir el mismo código ...
¡Gracias por su ayuda!
Aurel
Solución
Debe llamar a su método OnauthenticationsCess cargándolo como un servicio.En su config.yml:
authentication_handler:
class: Acme\Bundle\Service\AuthenticationHandler
arguments:
container: "@service_container"
y luego, llámalo en la función de autenticateuser:
protected function authenticateUser(UserInterface $user) {
try {
$this->container->get('fos_user.user_checker')->checkPostAuth($user);
} catch (AccountStatusException $e) {
// Don't authenticate locked, disabled or expired users
return;
}
$providerKey = $this->container->getParameter('fos_user.firewall_name');
$token = new UsernamePasswordToken($user, null, $providerKey, $user->getRoles());
$this->container->get('security.context')->setToken($token);
$request = $this->container->get('request');
$this->container->get('authentication_handler')->onAuthenticationSuccess($request, $token);
}
Este haga el truco y pase a través de su controlador de autenticación personalizado. Más información .