Bonjour,
Je développe un site avec Symfony 2.3 et FOSUserBundle qui utilise deux formulaire de login sur la page d'accueil (l'un pour l'accès pro et l'autre pour l'accès particuliers). J'utilise un UserProvider qui détecte le formulaire utilisé et log l'utilisateur dans la base et avec les rôles correspondants, puis mon contrôleur principal affiche la page d'accueil en fonction du rôle de l'utilisateur.
Jusque là tout va bien et fonctionne comme voulu, mais en cas d'échec de l'authentification je voudrais pouvoir détecter lequel des deux formulaires de login a été utilisé pour afficher un message dans ce formulaire et pas dans l'autre. Mon problème c'est qu'après un échec d'authentification je suis redirigé vers ma page d'accueil (très bien) mais je n'ai plus l'information du formulaire dans la requête. J'ai pensé à utiliser une variable de session mais l’échec d'authentification ferme la session.
Quelqu'un aurait une idée pour récupérer le nom du formulaire de login après la redirection en cas d'echec ?
Edit : finalement j'ai réussi à récupérer l'info en passant un message flash via mon provider, je mets la solution au cas où ça puisse servir à quelqu'un :
Tout d'abord il faut modifier un poil la config.yml pour récupérer la même session:
Ensuite créer un flash dans le UserProvider en fonction du form utilisé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 framework: session: handler_id: ~
Enfin dans mon contrôleur je peux récupérer le contenu du flash :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 public function loadUserByUsername($username) { $session = $this->container->get('request')->getSession() ; if ($this->container->get('request')->request->has('CustomerLogin')) { $class = '\MyApp\MyBundle\Entity\Customers'; $session->getFlashBag()->add('loginForm', 'Customer'); } elseif ($this->container->get('request')->request->has('ProLogin')) { $class = '\MyApp\MyBundle\\Entity\Professionals'; $session->getFlashBag()->add('loginForm', 'Pro'); } $this->userManager->setRepository($class); $user = $this->userManager->findUserBy(array('Login' => $username), array(), null, null, '0:0'); if (!$user) { throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username)); } return $user; }
Bon au moins ça marche, ++
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 $flashErrors = $session->getFlashBag()->all() ; $customerLoginError = null ; $proLoginError = null ; if ($request->attributes->has(SecurityContextInterface::AUTHENTICATION_ERROR)) { if ($flashErrors['loginForm'][0] == 'Customer') { $customerLoginError = $request->attributes->get(SecurityContextInterface::AUTHENTICATION_ERROR); } if ($flashErrors['loginForm'][0] == 'Pro') { $proLoginError = $request->attributes->get(SecurityContextInterface::AUTHENTICATION_ERROR); } } elseif (null !== $session && $session->has(SecurityContextInterface::AUTHENTICATION_ERROR)) { if ($flashErrors['loginForm'][0] == 'Customer') { $customerLoginError = $session->get(SecurityContextInterface::AUTHENTICATION_ERROR); } if ($flashErrors['loginForm'][0] == 'Pro') { $proLoginError = $session->get(SecurityContextInterface::AUTHENTICATION_ERROR) ; } $session->remove(SecurityContextInterface::AUTHENTICATION_ERROR); }
Partager