为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 isPasswordValid() 函数总是返回 false?

为什么 isPasswordValid() 函数总是返回 false?

PHP
Helenr 2023-12-15 14:59:09
我正在使用 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)        ;    }
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

简短回答:您正在使用新密码作为旧密码的哈希值。


说明:
我猜您将表单绑定到了您的用户类。 表单中的 password 字段已映射,这意味着它会更新您的用户财产。password

因此,由于该属性应包含“旧密码”的哈希但包含您的新密码,无法验证。


解决方案和改进:
最快的解决方案是 “取消映射” password 字段或删除 data_class 表单选项,并替换控制器中的一行:

// before: $newPassword = $user->getPassword();
$newPassword = $form->get('password')->getData();

我建议:

  • 取消表单与您的用户类的绑定

  • 对您的字段使用UserPassword验证约束oldPassword

  • 使用 $form->getData() 获取表单数据,而不是手动访问$request


查看完整回答
反对 回复 2023-12-15
?
绝地无双

TA贡献1946条经验 获得超4个赞

您将更改您的表单,因为如果您保留字段密码,则用户的密码也会被表单更改,所以正确的方法是:


- 在您的表格中:


public function buildForm(FormBuilderInterface $builder, array $options)

    {

        $builder

        ->add('oldPassword', PasswordType::class, [

            'mapped' => false,])

        ->add('newPassword',PasswordType::class, [

            'mapped' => false,])

        ;

    }

然后在你的控制器中更改获取新密码的方式


$oldPassword = $request->request->get('reset_pass')['oldPassword'];

$newPassword = $request->request->get('reset_pass')['newPassword'];

玩得开心 :)


查看完整回答
反对 回复 2023-12-15
  • 2 回答
  • 0 关注
  • 61 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信