首页 > 解决方案 > 如何在使用 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(),
    ]);
}

标签: symfonysymfony4symfony5

解决方案


更好的解决方案是使用约束。

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()
        ]);
    }

但我认为在更新用户实体时使用文档中的模型是一种更好的做法。


推荐阅读