Как изменить информацию пользователя после запроса его пароля с помощью Symfony 4 - PullRequest
1 голос
/ 09 апреля 2020

Я хотел бы создать страницу, которая позволяет пользователю изменять свою личную информацию. Я хочу, чтобы он ввел свой текущий пароль, чтобы изменить любую информацию.

Я создал форму на основе подключенного пользователя, когда форма отправлена ​​и действительна. Я хочу проверить, действителен ли пароль, с помощью функции isPasswordValid () моего passwordEncoder.

My Проблема в том, что когда эта функция вызывается с параметром $ 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()
        ]);
    }

1 Ответ

0 голосов
/ 10 апреля 2020

Лучшее решение - использовать ограничение.

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

Но я думаю, что лучше использовать такую ​​модель, как в документации когда вы обновляете свою пользовательскую сущность.

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