首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony4:密码更改问题

Symfony4:密码更改问题
EN

Stack Overflow用户
提问于 2019-09-25 07:28:31
回答 1查看 101关注 0票数 0

在symfony中,我被困在如何通过表单提交来更改密码上--而且我不知道如何解决它,因为它的行为似乎不同。

所以首先-我正在构建一个自定义表单,其中用户输入他们的旧密码,和一个新的两次。这是我的FormType:

UserPasswordType.php

代码语言:javascript
复制
<?php

namespace App\Form;

use App\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Security\Core\Validator\Constraints\UserPassword;

class UserPasswordType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            //basically just a unmapped password field
            ->add('password_current', PasswordType::class, [
                'label' => 'user.password.current', 
                'mapped' => false,
                /*'constraints' => new UserPassword()*/
            ])
            //RepeatedType to get a confirm password field
            ->add('password', RepeatedType::class, [
                'type' => PasswordType::class,
                'first_name' => 'new', 
                'first_options' => ['label' => 'user.password.new'], 
                'second_name' => 'confirm', 
                'second_options' => ['label' => 'user.password.confirm']
            ])
            ->add('save', SubmitType::class, ['label' => 'app.save']);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => User::class
        ]);
    }
}

,这是我的控制器:

代码语言:javascript
复制
    /**
     * @Route("/user/settings", name="app_user_settings", defaults={"_locale":"%locale%"})
     * @IsGranted("ROLE_USER")
     */
    public function user_settings(Request $request, UserPasswordEncoderInterface $passwordEncoder)
    {
        $user = $this->getUser();
        $form = $this->createForm(UserPasswordType::class, $user);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();

            //earlier: $current = $request->get('password_current'); - but does not work anymore?
            $current = $form['password']->getData();
            if ($passwordEncoder->isPasswordValid($user, $current)) { //fails always?
                $confirm = $form['password_confirm']->getData();
                $user->setPassword($passwordEncoder->encodePassword($user, $confirm));

                $em->persist($user);
                $em->flush();

                $this->addFlash('success', 'status.success.text');
                return $this->redirectToRoute('app_user');
            }
            $this->addFlash('danger', 'status.danger.text');
        }

        return $this->render('user/settings/index.html.twig', ['form' => $form->createView()]);
    }

,下面是我的问题:

由于某种原因,null

  • $passwordEncoder->isPasswordValid($user, $current)停止工作--它总是返回也停止工作--以前很好,现在它确实总是返回false
  • ,在password_current上的表单类型中的约束UserPassword()也一直无法验证,即使密码是正确的,尝试更改密码的登录用户
  • 在试图更改密码时仍然会被踢出(注销)(表单首先重新加载),然后,在执行任何操作后,他返回登录(但就在我检查旧密码时,用户不检查旧密码,用户就会继续登录并获得成功的闪存消息

)。

遗憾的是,我现在真的很困惑,因为我的大部分东西昨天都在工作。有人知道如何处理这些问题吗?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-25 08:21:28

我终于找到解决办法了。我将表单类型映射到实体。所以每当我输入一个新密码,我的“旧”密码实际上就是新的密码。这使得每一个验证都失败了。

因此,只需创建如下未映射的表单类型:

FormType

代码语言:javascript
复制
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('password_current', PasswordType::class, ['label' => 'user.password.current', 'constraints' => new UserPassword()])
            ->add('password', RepeatedType::class, ['type' => PasswordType::class, 'first_name' => 'new', 'first_options' => ['label' => 'user.password.new'], 'second_name' => 'confirm', 'second_options' => ['label' => 'user.password.confirm']])
            ->add('save', SubmitType::class, ['label' => 'app.save']);
    }

    /* Remove entire function
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => User::class
        ]);
    }*/

控制器

代码语言:javascript
复制
    //remove $user in createForm function
    //$form = $this->createForm(UserPasswordType::class, $user);
    $form = $this->createForm(UserPasswordType::class);

有趣的副作用。这也消除了我所有的其他问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58093261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档