如何解决为什么isPasswordValid函数总是返回false?
我正在使用Symfony4开发一个简单的重置密码系统。
我不知道为什么isPasswordValid()
总是返回 false ?
我正在使用 Bcrypt 哈希密码 这是Security.yaml的一些代码:
security:
encoders:
App\Entity\User:
algorithm: bcrypt
我不知道为什么isPasswordValid()
总是返回false。
我手动尝试过:
$pass="000000000";
dump($encoder->isPasswordValid($user,$pass));
die();
它转储为假。.
这是我在控制器上编写的函数:
/**
* @Route("/password",name="change_pass",methods={"GET","POST"})
* @IsGranted("ROLE_USER")
*/
public function edit(Request $request,UserPasswordEncoderInterface $encoder): Response
{
$user = $this->getUser();
$form = $this->createForm(ResetPasstype::class,$user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$oldPassword = $request->request->get('reset_pass')['oldPassword'];
$newPassword = $user->getpassword();
if ($encoder->isPasswordValid($user,$oldPassword)) {
$hash = $encoder->encodePassword($user,$newPassword);
$user->setPassword($hash);
$this->getDoctrine()->getManager()->flush();
$this->addFlash('success','Your password is succesfully changed');
}else {
$this->addFlash('fail','old password is wrong');
}
}
$this->getDoctrine()->getManager()->refresh($user);
return $this->render('consultant/changepass.html.twig',[
'form' => $form->createView(),]);
}
这是ResetPasstype形式:
public function buildForm(FormBuilderInterface $builder,array $options)
{
$builder
->add('oldPassword',PasswordType::class,[
'mapped' => false,])
->add('password',PasswordType::class)
;
}
解决方法
简短答案::您将新密码用作旧密码的哈希值。
说明:
我想您已将表格绑定到用户类。
表单中的password
字段是 mapped ,这意味着它会更新用户的password
属性。
因此,由于该属性应包含“旧密码”的哈希,但包含您的新密码,因此无法验证。
解决方案和改进:
最快的解决方案是“取消映射” password
字段或删除data_class
表单选项,并替换控制器中的一行:
// before: $newPassword = $user->getPassword();
$newPassword = $form->get('password')->getData();
我建议:
- 将表单取消绑定到您的用户类
- 在
oldPassword
字段中使用UserPassword验证约束 - 使用
$form->getData()
获取表单数据,而不是手动访问$request
您将更改表单,因为如果您保留字段密码,那么用户的密码也会被表单更改,因此正确的方法是:
-在您的表单中:
public function buildForm(FormBuilderInterface $builder,array $options)
{
$builder
->add('oldPassword',PasswordType::class,[
'mapped' => false,])
->add('newPassword',])
;
}
然后在您的控制器中更改获取新密码的方式
$oldPassword = $request->request->get('reset_pass')['oldPassword'];
$newPassword = $request->request->get('reset_pass')['newPassword'];
玩得开心:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。