Partage
  • Partager sur Facebook
  • Partager sur Twitter

Modification du mot de passe

Symfony 4

Sujet résolu
    23 janvier 2020 à 10:02:38

    Bonjour,

    J'ai écris un code, je n'ai pas d'erreur symfony, mais lorsque je renseigne le mot de passe actuel j'ai "mon" message mentionnant que le mot de passe n'est pas celui de la BDD, j'ai fais un dump avant l'envoie du formulaire, j'ai un mot de passe crypté, puis un dump après validation, et là c'est le mot de passe que j'ai écris "12345689"

    Est-ce-que mon problème ne vient pas d'ici ? quand symfony lit mon mot de passe, le voit-il crypté ?

    Ci-dessous mon code :

        /**
         * @Route("/{id}/password_modification", name="password_modification")
         */
    
        public function modificationPassword(User $user, Request $request, UserPasswordEncoderInterface $encoder, EntityManagerInterface $manager) 
        {
            $passwordUpdate = new PasswordUpdate();
    
            $form = $this->createForm(PasswordUpdateType::class, $passwordUpdate);
    
            $form->handleRequest($request);
            
            if($form->isSubmitted() && $form->isValid()) 
            {
                if(!password_verify($passwordUpdate->getOldPassword(), $user->getPassword()))
                {
                    $form->get('oldPassword')->addError(new FormError("Le mot de passe renseigné ne correspond pas à votre mot de passe actuel"));
                } 
                else 
                {
                    $newPassword = $passwordUpdate->getNewPassword();
                    $hash = $encoder->encodePassword($user, $newPassword);
                    $user->setPassword($hash);
                    $manager->persist($user);
                    $manager->flush();
                    $this->addFlash('success', "Votre mot de passe a bien été modifié !");
                    return $this->redirectToRoute('profil');
                }
            }
    
            return $this->render('user/password_modification.html.twig', [
                'form' => $form->createView(),
                'user' => $user
            ]);
        }

    Je vous en remercie par avance.

    -
    Edité par PierreRichard78 23 janvier 2020 à 10:07:27

    • Partager sur Facebook
    • Partager sur Twitter

    la chance sourit aux audacieux

      23 janvier 2020 à 10:20:44

      Salut,

      Fais un dump juste avant ton test.

      Tu compares bien l'ancien mot de passe rentré dans le formulaire que tu as hashé avec celui de ta base de données (qui est normalement hashé) ?

      Si oui, tu utilises le même hashage ?

      • Partager sur Facebook
      • Partager sur Twitter

      Xavier LEFEBURE - https://www.notifall.com

        23 janvier 2020 à 10:27:18

        Salut,

        Oui avant validation du formulaire le dump indique un mot de passe qui crypté (qui est sans cryptage 123456)

        après validation où j'ai renseigné le nouveau, le dump renvoie ce dernier.

        dans l'inscription et la modification j'utilise UserPasswordEncoderInterface et dans la security.yaml

        security:
            encoders:
                App\Entity\User:
                    algorithm: bcrypt
        • Partager sur Facebook
        • Partager sur Twitter

        la chance sourit aux audacieux

          23 janvier 2020 à 10:37:44

          Salut,

          voir ici https://symfonycasts.com/screencast/symfony-security/user-password , dans ton cas  $encoder->isValidPassword($user, $passwordUpdate->getOldPassword())

          • Partager sur Facebook
          • Partager sur Twitter
          le bienfait n'est jamais perdu
            23 janvier 2020 à 10:57:07

            Je ne comprends pas trop ce tuto,

            Déjà, est-ce-que Symfony lit mon mot de passe ou seulement l'encryptage ? car le dump le rapporte crypté pourtant lors d'une connexion ça ne pose pas de problème, je suis un peu confus sur ce problème

            • Partager sur Facebook
            • Partager sur Twitter

            la chance sourit aux audacieux

              23 janvier 2020 à 11:35:59

              J'ai donné un code dans mon message
              • Partager sur Facebook
              • Partager sur Twitter
              le bienfait n'est jamais perdu
                23 janvier 2020 à 14:41:21

                désolé je ne comprends et personne ne m'a expliqué dans mon code qu'est ce qu'il n'allait pas
                • Partager sur Facebook
                • Partager sur Twitter

                la chance sourit aux audacieux

                  23 janvier 2020 à 15:37:39

                  Ton code a l'air correct en tout cas dans l'utilisation de password_verify.

                  Peux-t-on avoir le dump de $user->getPassword() et $passwordUpdate->getOldPassword() ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                  le bienfait n'est jamais perdu
                    23 janvier 2020 à 16:11:32

                    Bien sûr,

                    $user->getPassword()    = "$2y$13$nAVjrAYfSoKrfDHA2pSb6ufagxsJ2qlqbWT1qKhtcgT7MjfyhrD7q"


                    $passwordUpdate->getOldPassword() = null 


                    Tu soulèves un point, quand je fais les tests j'utilise plutôt setOldPassword, pour voir ce que j'ai écris dans l'input, ça me met 123456, c'est pour ça que je me suis posé la question si le problème vient pas de l'encodage, d'un côté crypté, de l'autre non...

                    Effectivement, de base le getOldPassword est null car il n'est relié à rien, ce n'est pas une entity transcrite en BDD c'est juste une interface qui compare 2 variables

                    • Partager sur Facebook
                    • Partager sur Twitter

                    la chance sourit aux audacieux

                      23 janvier 2020 à 16:21:45

                      Peux-t-on voir tes classe PasswordUpdate et PasswordUpdateType ?  Que te donne un dump($form->getData()); dans le premier if ? .
                      • Partager sur Facebook
                      • Partager sur Twitter
                      le bienfait n'est jamais perdu
                        23 janvier 2020 à 16:44:04

                        Entity PasswordUpdate :

                        <?php
                        
                        namespace App\Entity;
                        use Symfony\Component\Validator\Constraints as Assert;
                        
                        
                        class PasswordUpdate
                        {
                            private $oldPassword;
                        
                            /**
                             * @Assert\Length(min=6, minMessage="Votre mot de passe doit faire au moins 6 caractères !")
                             */
                            private $newPassword;
                        
                            /**
                             * @Assert\EqualTo(propertyPath="newPassword", message="Vous n'avez pas correctement confirmé votre nouveau mot de passe")
                             */
                            private $confirmPassword;
                        
                        
                        
                            public function getOldPassword(): ?string
                            {
                                return $this->oldPassword;
                            }
                        
                            public function setOldPassword(string $oldPassword): self
                            {
                                $this->oldPassword = $oldPassword;
                        
                                return $this;
                            }
                        
                            public function getNewPassword(): ?string
                            {
                                return $this->newPassword;
                            }
                        
                            public function setNewPassword(string $newPassword): self
                            {
                                $this->newPassword = $newPassword;
                        
                                return $this;
                            }
                        
                            public function getConfirmPassword(): ?string
                            {
                                return $this->confirmPassword;
                            }
                        
                            public function setConfirmPassword(string $confirmPassword): self
                            {
                                $this->confirmPassword = $confirmPassword;
                        
                                return $this;
                            }
                        }
                        

                        PasswordUpdateType :

                        <?php
                        
                        namespace App\Form;
                        
                        use Symfony\Component\Form\AbstractType;
                        use Symfony\Component\Form\FormBuilderInterface;
                        use Symfony\Component\OptionsResolver\OptionsResolver;
                        use Symfony\Component\Form\Extension\Core\Type\PasswordType;
                        
                        class PasswordUpdateType extends AbstractType
                        {
                            public function buildForm(FormBuilderInterface $builder, array $options)
                            {
                                $builder
                        
                                ->add('oldPassword', PasswordType::class, array(
                                    'mapped' => false,
                                    'label' => 'Ancien mot de passe',
                                    
                                ))
                        
                                ->add('newPassword', PasswordType::class, array(
                                    'mapped' => false,
                                    'label' => 'Ancien mot de passe'
                                ))
                        
                                ->add('confirmPassword', PasswordType::class, array(
                                    'mapped' => false,
                                    'label' => 'Ancien mot de passe'
                                ))
                               
                                ;
                            }
                        
                            public function configureOptions(OptionsResolver $resolver)
                            {
                                $resolver->setDefaults([
                                    // Configure your form options here
                                ]);
                            }
                        }
                        

                        le dump retourne : 

                        oldPassword: null -newPassword: null -confirmPassword: null

                        le OldPassword est null c'est pour ça que j'ai le message d'erreur... franchement je ne vois pas..

                        -
                        Edité par PierreRichard78 23 janvier 2020 à 16:45:00

                        • Partager sur Facebook
                        • Partager sur Twitter

                        la chance sourit aux audacieux

                          23 janvier 2020 à 16:48:21

                          Tu as oublié un 'data_class' => PasswordUpdate::class dans setDefaults, n'oublie pas le use App\Entity\PasswordUpdate;
                          • Partager sur Facebook
                          • Partager sur Twitter
                          le bienfait n'est jamais perdu
                            23 janvier 2020 à 17:10:02

                            ah mince oui j'ai oublié le data_class, malheureusement le problème reste inchangé, et le dump get data mentionne toujours des null...
                            • Partager sur Facebook
                            • Partager sur Twitter

                            la chance sourit aux audacieux

                              23 janvier 2020 à 17:13:46

                              Et sans les mapped=> false ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                              le bienfait n'est jamais perdu
                                23 janvier 2020 à 17:20:11

                                sans le mapped=>false; le problème est toujours là mais dans le dump je vois les mots de passes, ce que j'ai écris (non crypté)
                                • Partager sur Facebook
                                • Partager sur Twitter

                                la chance sourit aux audacieux

                                  23 janvier 2020 à 17:23:16

                                  Quel problème ? toujours null avec $passwordUpdate->getOldPassword() ? Quel dump te donne tes mots de passe non hashés (ce qui est normal d'ailleurs) , celui de $form->getData() ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  le bienfait n'est jamais perdu
                                    23 janvier 2020 à 18:00:20

                                    pas d'erreur symfony mais le message qui me dit que mon mot de passe n'est pas correct.

                                    oui toujours null avec $passwordUpdate->getOldPassword()

                                    et le dump $form->getData(); renseigne bien les mots de passe non cryptés

                                    est-ce-que le problème ne serait pas là ? 

                                    $passwordUpdate->setOldPassword() = mot de passe non crypté et $user->getPassword() = mot de passe crypté ??

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    la chance sourit aux audacieux

                                      23 janvier 2020 à 18:06:01

                                      c'est comme ça que password_verify fonctionne, 1ère entrée mot de passe en clair et en 2ème un hashé. si tu as les bonnes valeurs dans getData alors autant l'utiliser directement $passwordUpdate = $form->getData();
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      le bienfait n'est jamais perdu
                                        23 janvier 2020 à 18:25:47

                                        Comment ça ?.

                                        je l'utilise à quel endroit ?

                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        la chance sourit aux audacieux

                                          23 janvier 2020 à 18:46:11

                                          avant password_verify
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          le bienfait n'est jamais perdu
                                            23 janvier 2020 à 19:01:30

                                            Tu veux dire comme ça : 

                                             if($form->isSubmitted() && $form->isValid()) 
                                                    {
                                                        $passwordUpdate = $form->getData();
                                                        if(!password_verify($passwordUpdate->getOldPassword(), $user->getPassword()))
                                                        {
                                                            $form->get('oldPassword')->addError(new FormError("Le mot de passe renseigné ne correspond pas à votre mot de passe actuel"));
                                                            dump($form->getData());
                                                        } 

                                            si c'est le cas, c'est toujours pas ça... si tu me dis que symfony lit pareil les mots de passe cryptés ou non, je ne vois pas pourquoi alors quand je remplie le OldPassword qui est celui en bdd c'est écrit que je me suis trompé..

                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            la chance sourit aux audacieux

                                              23 janvier 2020 à 19:48:52

                                              juste après la ligne 3 de ce code, que te donne un dump de ta $passwordUpdate->getOldPassWord()? essaie de lire la documentation de password_verify , 

                                              https://3v4l.org/PAKs5 tu vois que ça fonctionne avec ton mot de passe 123456 et le hash donné donc le soucis est au niveau de $passwordUpdate->getOldPassword()

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              le bienfait n'est jamais perdu
                                                23 janvier 2020 à 20:02:03

                                                oui le soucis vient du getOldPassword car le dump me retourne bien le mot de passe "123456"

                                                je vais regarder la doc

                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                la chance sourit aux audacieux

                                                  23 janvier 2020 à 20:09:48

                                                  le dump te donne 123456? normalement ça devrait passer (voir mon lien), c'est bien le même hash que tu as donné dans ton message ?
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  le bienfait n'est jamais perdu
                                                    23 janvier 2020 à 20:19:54

                                                    oui c'est ça qui est bizarre, c'est pour ça que tant que je suis en localhost, je ne me complique pas la vie sur les mots de passe avec des conditions, je reste simple avec toujours 123456

                                                    le dump me le retourne bien, je ne comprends pas le problème

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    la chance sourit aux audacieux

                                                      23 janvier 2020 à 20:36:42

                                                      Redonne les dumps des 2 paramètres de password_verify, je vais revérifier, quelque chose nous échappe,  c'est sur. 

                                                      Et en remplaçant password_verify par $encoder->isValidPassword($passwordUpdate->getOldPassword(), $user) ?

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      le bienfait n'est jamais perdu
                                                        23 janvier 2020 à 22:20:23

                                                        le dump de $passwordUpdate->getOldPassword()= "123456"

                                                        et celui de $user->getPassword() = "$2y$13$Byk5uH9/MJEH/0jwEdeELOMvIEWaMuwCptT6.YLYD3tWulxYHHwBS"


                                                        pourtant l'un est bien égal à l'autre, c'est incroyable


                                                        pour password_verify il est souligné en rouge, je me documente sur l'injection

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        la chance sourit aux audacieux

                                                          23 janvier 2020 à 22:47:22

                                                          Non par contre là il n y a pas de correspondance https://3v4l.org/SvYUW , ce n'est pas le même hash que ce que tu as donné précédemment , il faudrait  bien faire tes tests
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          le bienfait n'est jamais perdu
                                                            23 janvier 2020 à 22:53:46

                                                            ah oui pardon, j'ai entre temps recrée un compte, c'est ma faute.

                                                            Je viens de retourner sur mon adresse principale, je ne peux plus me connecter avec 123456 j'ai tenté 123456789 (le nouveau mot de passe) et je suis connecté 

                                                            je viens d'essayer de rechanger mon mot de passe et ça fonctionne ... euuh je suis content mais je n'ai pas compris et j'ai rien touché

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            la chance sourit aux audacieux

                                                              23 janvier 2020 à 23:02:27

                                                              Je pense que tu te trompais au niveau de l'ancienne valeur, le dernier hash ne fonctionne pas avec 123456 mais avec 123456789
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter
                                                              le bienfait n'est jamais perdu

                                                              Modification du mot de passe

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown