我正在使用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)
;
}
答案 0 :(得分:2)
简短答案::您将新密码用作旧密码的哈希值。
说明:
我想您已将表格绑定到用户类。
表单中的password
字段是 mapped ,这意味着它会更新用户的password
属性。
因此,由于该属性应包含“旧密码”的哈希,但包含您的新密码,因此无法验证。
解决方案和改进:
最快的解决方案是“取消映射” password
字段或删除data_class
表单选项,并替换控制器中的一行:
// before: $newPassword = $user->getPassword();
$newPassword = $form->get('password')->getData();
我建议:
oldPassword
字段中使用UserPassword验证约束$form->getData()
获取表单数据,而不是手动访问$request
答案 1 :(得分:0)
您将更改表单,因为如果您保留字段密码,那么用户的密码也会被表单更改,因此正确的方法是:
-在您的表单中:
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'];
玩得开心:)