У меня проблема, когда я пытаюсь сбросить пароль для незарегистрированного пользователя.
Пользователи сущности:
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.');
}
[...]
Когда пользователь вошел в систему, это работает, но когда пользователь использует пароль для сброса, это потому, что он потерял свой пароль. Так что он должен работать, когда пользователь не вошел в систему.
Спасибо за вашу помощь !
Алекс
И какая именно линия вызывает у вас проблемы? Я подозреваю, что encodePassword () - вы можете подтвердить?
Проблема в том, что Symfony поддерживает несколько кодировщиков в зависимости от класса пользователя. При входе в систему вводится правильный кодировщик на основе текущего пользователя, вошедшего в систему. Если вы не вошли в журнал, то невозможно определить, какой кодировщик следует использовать. Вместо этого вам нужно использовать EncoderFactory для выбора правильного кодировщика. Взгляните на Непринятый ответ здесь для примера.
@ AlexBarylski: Да, я знаю интерфейс, я его изменю. Я редактирую в точном соответствии с проблемой.
@Cerad: Хорошо, я понимаю. Я попытаюсь использовать непосредственно фабрику кодировщиков, думаю, у меня нет выбора. Но я не понимаю, почему Symfony не ожидала этого случая?
@alxb У тебя это работает? Возможно, я ввел вас в заблуждение относительно предположения о нескольких кодировщиках. Похоже, у вас может быть где-то слушатель, который пытается проверить пароль, даже если пользователь не вошел в систему. Возможно, что-то связано с вашим двухфакторным материалом или кодом доверенного устройства.
Хорошо, наконец, я нашел решение: я удаляю поле OldPassword с его утверждением (было идиотом просить пользователя установить свой старый пароль в форме сброса пароля!), И теперь он работает. Функция validate () была вызвана для handleRequest, потому что это ограничение для поля OldPassword.




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