为什么 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)

        ;

    }


Helenr
浏览 123回答 2
2回答

当年话下

简短回答:您正在使用新密码作为旧密码的哈希值。说明:我猜您将表单绑定到了您的用户类。 表单中的 password 字段已映射,这意味着它会更新您的用户财产。password因此,由于该属性应包含“旧密码”的哈希但包含您的新密码,无法验证。解决方案和改进:最快的解决方案是 “取消映射” password 字段或删除 data_class 表单选项,并替换控制器中的一行:// before: $newPassword = $user->getPassword(); $newPassword = $form->get('password')->getData();我建议:取消表单与您的用户类的绑定对您的字段使用UserPassword验证约束oldPassword使用 $form->getData() 获取表单数据,而不是手动访问$request

绝地无双

您将更改您的表单,因为如果您保留字段密码,则用户的密码也会被表单更改,所以正确的方法是:- 在您的表格中: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'];玩得开心 :)
打开App,查看更多内容
随时随地看视频慕课网APP