亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 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 關注
  • 221 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號