Сбросить пароль symfony 4 (пользователь не вошел в систему)

У меня проблема, когда я пытаюсь сбросить пароль для незарегистрированного пользователя.

Пользователи сущности:

class Users implements AdvancedUserInterface, \Serializable, TwoFactorInterface, TrustedDeviceInterface  {

[...]
}

Действие по сбросу пароля:

public function forgetPassword(Request $request, EntityManagerInterface $em, UserPasswordEncoderInterface $encoder)
    {
        $changePasswordModel = new ChangePassword();
        $form = $this->createForm(ForgetPasswordType::class, $changePasswordModel);
        $form->handleRequest($request);


        $user = $em->getRepository("App:Users")->find(12);
        if (!$request->get('token') || !$user || $user->getTokenExpire() <= new \DateTime())
        {
            return $this->redirectToRoute("404");
        }

        if ($form->isSubmitted() && $form->isValid())
        {
            $plainPassword = $form->getData()->getNewPassword();
            $encoded = $encoder->encodePassword($user, $plainPassword);
            $user->setPassword($encoded);
            $em->persist($user);
            $em->flush();

        }

        return $this->render('security/forget_password.html.twig', array(
            'form'    => $form->createView(),
            'success' => $success
        ));
    }

Но я получаю эту ошибку:

The User object must implement the UserInterface interface.

Точное место этой ошибки: \ vendor \ symfony \ security \ Core \ Validator \ Constraints \ UserPasswordValidator.php:

[...]
 $user = $this->tokenStorage->getToken()->getUser();

        if (!$user instanceof UserInterface) {
            throw new ConstraintDefinitionException('The User object must 
            implement the UserInterface interface.');
        }
[...]

Когда пользователь вошел в систему, это работает, но когда пользователь использует пароль для сброса, это потому, что он потерял свой пароль. Так что он должен работать, когда пользователь не вошел в систему.

Спасибо за вашу помощь !

Алекс

Просто мысль ... но они устарели этот интерфейс в SF4.1 + (symfony.com/blog/…)

Alex.Barylski 14.01.2019 20:55

И какая именно линия вызывает у вас проблемы? Я подозреваю, что encodePassword () - вы можете подтвердить?

Alex.Barylski 14.01.2019 20:56

Проблема в том, что Symfony поддерживает несколько кодировщиков в зависимости от класса пользователя. При входе в систему вводится правильный кодировщик на основе текущего пользователя, вошедшего в систему. Если вы не вошли в журнал, то невозможно определить, какой кодировщик следует использовать. Вместо этого вам нужно использовать EncoderFactory для выбора правильного кодировщика. Взгляните на Непринятый ответ здесь для примера.

Cerad 14.01.2019 22:17

@ AlexBarylski: Да, я знаю интерфейс, я его изменю. Я редактирую в точном соответствии с проблемой.

alxb 14.01.2019 23:21

@Cerad: Хорошо, я понимаю. Я попытаюсь использовать непосредственно фабрику кодировщиков, думаю, у меня нет выбора. Но я не понимаю, почему Symfony не ожидала этого случая?

alxb 14.01.2019 23:29

@alxb У тебя это работает? Возможно, я ввел вас в заблуждение относительно предположения о нескольких кодировщиках. Похоже, у вас может быть где-то слушатель, который пытается проверить пароль, даже если пользователь не вошел в систему. Возможно, что-то связано с вашим двухфакторным материалом или кодом доверенного устройства.

Cerad 15.01.2019 16:25

Хорошо, наконец, я нашел решение: я удаляю поле OldPassword с его утверждением (было идиотом просить пользователя установить свой старый пароль в форме сброса пароля!), И теперь он работает. Функция validate () была вызвана для handleRequest, потому что это ограничение для поля OldPassword.

alxb 15.01.2019 17:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
7
1 030
0

Другие вопросы по теме