Symfony 2 & FosuserBundle: authentifier l'utilisateur après la réinitialisation du mot de passe
-
13-12-2019 - |
Question
Lorsque le contrôleur de mot de passe de réinitialisation de FosuserBundle remplace, il existe une méthode d'appel de la fonction "authentificateur" (ligne 104):
....
$this->authenticateUser($user);
....
Mon problème est que je remplace déjà le gestionnaire d'authentification Symfony et que j'ai mon propre logique lorsqu'un utilisateur se connecte.
<?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);
}
}
Ainsi, comment puis-je appeler la méthode "OnaTuthentiCessUCCESS" de mon gestionnaire d'authentification dans la réinitialisation de la réinitialisation? Afin d'éviter de réécrire le même code ...
Merci pour votre aide!
Aurel
La solution
Vous devez appeler votre méthode OnAuthentiCessUCCESSCESSE en chargement en tant que service.Dans votre config.yml:
authentication_handler:
class: Acme\Bundle\Service\AuthenticationHandler
arguments:
container: "@service_container"
Ensuite, appelez-le dans la fonction authentifiétuser:
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);
}
Cela fait l'affaire et passez à travers votre gestionnaire d'authentification personnalisé. Plus d'infos .