Я работаю над приложением, использующим 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 'Я постоянно нахожусь в состоянии, когда пароли не совпадают, хотя мои дампы работают, что означает, что информация восстанавливается. Спасибо!