symfony - 如何在使用 Symfony 4 要求他的密码后修改用户信息
问题描述
我想创建一个页面,允许用户修改他的个人信息。我希望他输入他当前的密码来修改任何信息。
当表单提交并且有效时,我根据连接的用户创建了一个表单,我想使用我的 passwordEncoder 的 isPasswordValid() 函数检查密码是否有效。
我的问题是,当使用 $user 作为参数调用此函数时,它总是返回 false。我发现这个问题来自哪里,这是因为在提交表单时,用作参数的 $user 被修改了。我尝试声明另一个变量来存储我的初始用户(例如 $dbUser)并使用另一个变量来实例化表单,但是当我转储 $dbUser 时它已被修改,我不知道为什么......
提交后不应更改该变量,因为它从未使用过...我找不到我做错了什么...
/**
* @Route("/mes-infos", name="account_infos")
*/
public function showMyInfos(Request $request, UserRepository $userRepo)
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$user = $this->getUser();
// $dbUser = $userRepo->findOneBy(['id' => 13]);
$form = $this->createForm(UserModificationType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$enteredPassword = $request->request->get('user_modification')['plainPassword'];
$passwordEncoder = $this->passwordEncoder;
$manager = $this->getDoctrine()->getManager();
if ($passwordEncoder->isPasswordValid($user, $enteredPassword)) {
dd('it works!!!!!');
// $manager->persist($user);
// $manager->flush();
} else {
dd('It\'s not!!!!');
}
}
return $this->render('account/myaccount-infos.html.twig', [
'form' => $form->createView(),
]);
}
解决方案
更好的解决方案是使用约束。
Symfony 已经实现了UserPasswordConstraint。
您可以直接将其添加到您的实体中。小心为这个约束声明一个组。如果您不这样做,您的用例“用户更新”将正常工作,但用例“用户创建”现在将失败。
namespace App\Entity;
use Symfony\Component\Security\Core\Validator\Constraints as SecurityAssert;
class User
{
//...
/**
* @SecurityAssert\UserPassword(
* message = "Wrong value for your current password",
* groups = {"update"}
* )
*/
protected $password;
//...
}
在您的表单中,通过更新(或添加)configureOptions 方法来指定验证组:
//App\Form\UserModificationType
//...
class UserModificationType {
//...
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
// ...
'validation_groups' => ['update'],
]);
}
}
然后您的 $form->isValid() 将自动测试密码。因此,您可以删除“if 条件”中的所有行。
/**
* @Route("/mes-infos", name="account_infos")
*/
public function showMyInfos(Request $request, UserRepository $userRepo)
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$user = $this->getUser();
$form = $this->createForm(UserModificationType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
dd('Password is good! it works!!!!!');
}
return $this->render('account/myaccount-infos.html.twig', [
'form' => $form->createView()
]);
}
但我认为在更新用户实体时使用文档中的模型是一种更好的做法。
推荐阅读
- python - 从今天的日期到“n”周前提取大块 Pandas 数据框
- sql - Sql 加入字段但首先通过分隔符拆分值并仅使用部分
- android - 用于单例模型的 Android Kotlin 对象与 Dagger2
- image - Docker 容器在底层镜像被删除后启动,这怎么可能?
- python - 如何在 SQL Server 上安装自写库
- python - 图表断开:无法获取张量的值 Tensor("conv2d_1_input:0", shape=(?, 128, 128, 1), dtype=float32)
- flutter - Flutter中网页的JSON发生变化时如何通知用户?
- vue.js - Vue计算方法无法使用模板中的setter更改数据
- sql - 如何使用排名获取最新的奖金记录
- python - 应用程序启动时的python数据库迁移