symfony 4 php password_verify не работает правильно - PullRequest
0 голосов
/ 22 октября 2019

Я работаю над приложением, использующим Symfony 4.3. В настоящее время я работаю над функцией изменения пароля пользователя, и для этого я сначала проверяю, знает ли пользователь свой пароль, прежде чем менять его. Я делаю это, набирая значение своего текущего пароля в виде формы. Однако функция php password_verify, похоже, не распознает действительный пароль пользователя, когда он хочет его изменить. Я использую конструктор форм Symfony, который позволяет мне получать значения, не устанавливая их самостоятельно. Мы можем правильно восстановить пароль пользователя и хеш, но функция всегда возвращает false. Я использую алгоритм 'auto' для шифрования паролей в security.yaml.

. Я перепробовал все: от использования одинарных кавычек до двойных кавычек, от использования простого текста как для слова password, так и для закодированной версии. это как so:password_verify('password','encoded_version') или использование функции динамически. Ниже приведен код, который я написал. Как уже говорилось ранее, я использую конструктор форм Symfony.

ФОРМА ДЛЯ ВВЕДЕНИЯ В ПАРОЛЬ

class PasswordUpdateType extends AbstractType
{

    /**
     * Permet d'avoir la configuration d'un chanmp
     *
     * @param string $label
     * @param string $placeholder
     * @return array $options
     * @return array
     */
    private function getConfiguration($label, $placeholder, $options = []) {
        return array_merge([
            'label' => $label,
            'attr'=>[
                'placeholder'=>$placeholder
            ]
        ], $options);
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
        ->add('oldPassword', PasswordType::class, $this->getConfiguration("Ancien mot de passe","Saisier le mot de passe actuel"))
        ->add('newPassword', PasswordType::class, $this->getConfiguration("Nouveau mot de passe","Saisier le mot de passe actuel"))
        ->add('confirmPassword', PasswordType::class, $this->getConfiguration("Confirmer le mouveau mot de passe","Saisier le mot de passe actuel"))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => PasswordUpdate::class,
        ]);
    }
}

КОД ДЛЯ ПРОВЕРКИ МАТЧА ПАРОЛЕЙ

public function updatePassword(Request $request, UserPasswordEncoderInterface $encoder, ObjectManager $manager) {
        $passwordUpdate = new PasswordUpdate();
        $user=$this->getUser();

        $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 saisi n'est pas le mot de passe actuel")); 
                //dump($passwordUpdate->getOldPassword());
                //dump(password_verify($passwordUpdate->getOldPassword(),$user->getPassword()));
                dump($passwordUpdate->getOldPassword());
                dump($encoder->encodePassword($user,$passwordUpdate->getOldPassword()));
                dump(gettype($user->getPassword()));
                dump(password_get_info($passwordUpdate->getOldPassword()));
                die();


            }

I 'Я постоянно нахожусь в состоянии, когда пароли не совпадают, хотя мои дампы работают, что означает, что информация восстанавливается. Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Symfony имеет ограничение для проверки текущего пароля в отправленной форме: UserPassword

Вы можете следовать документации и добавить выделенный $oldPassword к вашей пользовательской сущности с этим ограничением, илиВы можете добавить его непосредственно к типу формы, например, так:

->add('oldPassword', PasswordType::class, [
    'label' => 'Your current password',
    'mapped' => false,
    'constraints' => [
        new NotBlank(),
        new UserPassword()
    ]
])

Обратите внимание, что Symfony также имеет ограничение для проверки идентичности двух входных данных (например, поле «Подтверждение пароля»): RepeatedType . Попробуйте использовать эти два ограничения вместо ручной проверки пользовательского ввода в вашем контроллере.

0 голосов
/ 23 октября 2019

Используйте класс UserPasswordEncoder см. https://symfony.com/doc/current/security.html#c-encoding-passwords

 public function __construct(UserPasswordEncoderInterface $passwordEncoder)
 {
     $this->passwordEncoder = $passwordEncoder;
 }

public function updatePassword(..)
{
     // ....
     if(!$this->passwordEncoder->isPasswordValid($user, $password)) {

     }
...