Symfony4: Проблемы со сменой пароля - PullRequest
0 голосов
/ 25 сентября 2019

Я застрял на том, как изменить пароли путем отправки формы в Symfony - и я понятия не имею, как ее решить, так как кажется, что она ведет себя по-другому.

Итак, прежде всего - я создаю пользовательскийФорма, где пользователь вводит свой старый пароль, а новый дважды.Это мой FormType:

UserPasswordType.php

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

А вот мой контроллер:

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

Итак, вот мои проблемы:

  • по какой-то причине $current = $request->get('password_current') перестал работать - он всегда возвращает ноль

  • $passwordEncoder->isPasswordValid($user, $current) также перестал работать - раньше все было в порядке, теперь он буквально всегда возвращает false

  • ограничение UserPassword() в моем типе на password_current также не проходит проверку, даже если пароль правильный

  • вошедший в систему пользователь, пытающийся сменить пароль, продолжает выгнан (выход) из системы при попытке сменить пароль (форма сначала перезагружается, а затем после любого действия, к которому он возвращаетсялогин) - но только когда я проверяю старый пароль - без проверки старого пароля пользователь остается в системе и получает флеш-сообщение об успехе

К сожалению, я действительно запутался сейчас, потому чтобольшинство моих вещей работали вчера.Кто-нибудь знает, как подойти к этим вопросам?Спасибо

1 Ответ

0 голосов
/ 25 сентября 2019

Ну, я наконец нашел решение.Я сопоставил тип формы с сущностью.Поэтому, когда бы я ни вводил новый пароль, мой «старый» пароль фактически является новым.Это делает каждую проверку неудачной.

Так что просто создайте несопоставленный тип формы следующим образом:

FormType

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

Контроллер

    //remove $user in createForm function
    //$form = $this->createForm(UserPasswordType::class, $user);
    $form = $this->createForm(UserPasswordType::class);

Забавная сторона-эффект.Это также устраняет все другие проблемы, которые у меня были.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...