Bonjour à tous !
Je viens vers vous car je fais face un problème dont je n’arrive pas à trouver la solution.
J’utilise Symfony 4 - je suis encore en phase d’apprentissage du framework - et j’essaie actuellement de mettre en place une simple authentification en utilisant la classe UserInterface.
L’inscription fonctionne très bien et le mot de passe crypté avec bcrypt est bien stocké dans la BDD. Je vous mets le code, au cas où :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <?php /** * @Route("/inscription", name="registration") */ public function register(Request $request, SessionInterface $session, UserPasswordEncoderInterface $encoder) { $user = new User(); //Création du formulaire $form = $this->createFormBuilder($user) ->add('username', TextType::class, array('label' => 'Pseudo')) ->add('password', PasswordType::class, array('label' => 'Mot de passe')) ->add('email', EmailType::class, array('label' => 'Adresse email')) ->add('register', SubmitType::class, array('label' => 'S\'inscrire')) ->getForm(); $form->handleRequest($request); if($form->isSubmitted() && $form->isValid()) { $user = $form->getData(); //Sauvegarde des données dans la base $entity = $this->getDoctrine()->getManager(); //Récupération du rôle par défaut du compte lors de l'inscription, à savoir, le rôle User $role = $entity->getRepository(Role::class)->findOneBy([ 'name' => 'User']); $passwordEncoded = $encoder->encodePassword($user, $user->getPassword()); $user->setRoles($role); $user->setPassword($passwordEncoded); $entity->persist($user); $entity->flush(); //Ajout du pseudo et du rôle dans la session $session->set('pseudo', $user->getUsername()); $session->set('role', $user->getRoles()->getName()); $this->addFlash( 'notice', 'Inscription réussie' ); return $this->redirectToRoute('index'); } return $this->render('user/registration.html.twig', array( 'form' => $form->createView() )); } ?> |
Par contre, impossible de mettre en place l’authentification malgré avoir regardé encore et encore dans la documentation.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | <?php /** * @Route("/connexion", name="connexion") */ public function connection(Request $request, SessionInterface $session, UserPasswordEncoderInterface $encoder) { $user = new User(); $form = $this->createFormBuilder($user) ->add('username', TextType::class, array('label' => 'Pseudo')) ->add('password', PasswordType::class, array('label' => 'Mot de passe')) ->add('connection', SubmitType::class, array('label' => 'Se connecter')) ->getForm(); $form->handleRequest($request); if($form->isSubmitted() && $form->isValid()) { $pseudo = $form->get('username')->getData(); //Recherche dans la base de donnée s'il y a bien un compte $user = $this->getDoctrine()->getRepository(User::class)->findOneBy([ 'username' => $pseudo, ]); //S'il y a bien un compte avec le pseudo donné, vérification du mot de passe if($user) { if ($encoder->isPasswordValid($user, $form->get('password')->getData())) { $session->set('pseudo', $pseudo); $session->set('role', $user->getRoles()->getName()); $this->addFlash( 'notice', 'Connecté' ); return $this->redirectToRoute('index'); } else { $this->addFlash( 'notice', $user->getPassword() ); }; } else { $this->addFlash( 'notice', 'Pseudo et/ou mot de passe incorrecte' ); } } return $this->render('user/login.html.twig', array( 'form' => $form->createView() )); } ?> |
Ma méthode de connexion arrive à me trouver l’utilisateur via son username mais ensuite, pas moyen d’utiliser la fonction isPasswordValid() qui me renvoie toujours faux et je ne sais pas pourquoi. En regardant dans la documentation, il est indiqué qu’avec bcrypt, il ne faut pas utiliser de "salt" car il en a un intégré.
Du coup, j’avoue que je suis perdu. J’ai manqué quelque chose ?
Merci d’avance !