我正在使用Symfony 4.3开发应用程序。我目前正在使用一种功能来修改用户的密码,为此,我首先要在确认用户知道他的密码后再进行更改。我是通过在表单类型中键入其当前密码的值来实现的。但是,php password_verify
函数似乎无法识别用户想要更改的实际密码。我正在使用symfony表单构建器,该构建器允许我获取值而无需自己明确设置它们。我们能够正确地恢复用户密码和哈希值,但是该函数始终返回false。我正在使用“自动”算法来加密security.yaml
中的密码。
我已经尝试了一切,从使用单引号到双引号,从使用纯文本作为单词密码和它的编码版本(如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();
}
尽管我的转储正在工作,但我总是处于密码不匹配的状态,这意味着信息正在恢复。谢谢!
public function __construct(UserPasswordEncoderInterface $passwordEncoder)
{
$this->passwordEncoder = $passwordEncoder;
}
public function updatePassword(..)
{
// ....
if(!$this->passwordEncoder->isPasswordValid($user, $password)) {
}