Итак, я пытаюсь создать веб-сайт с помощью symfony, у которого есть пользователи.
Эти пользователи должны иметь возможность изменять свои пароли из своих учетных записей (это не должно быть трудным, простая форма, которая при отправке изменяет пароль текущего user). Однако я изо всех сил пытаюсь разработать метод реализации «Сброс пароля» "для пользователей, которые полностью забыли свой пароль.
Я планировал отправить пользователям электронное письмо с уникальной ссылкой. При посещении этой ссылки symfony (через тег slug) проверяет, была ли эта ссылка отправлена за последние 5 минут. (возможно, где-нибудь база данных со списком ссылок, раз понадобится логин). тогда пользователю будет предоставлена простая форма, в которой он сможет ввести свой новый пароль, а затем будет перенаправлен на страницу входа.
Моя проблема в том, что я не могу надеяться запустить getUser, когда пользователь фактически не аутентифицирован. Даже если моя база данных времени, ссылок и имен пользователей может указывать на конкретного пользователя, насколько я могу судить, Symfony не будет загружать класс user, пока они не будут должным образом аутентифицированы паролем. Как мне это обойти? Должен ли я просто писать в базу данных вручную без использования класса securityBundle / user? Спасибо.






Вы можете загрузить пользователя в любое время. Когда вы находитесь на странице сброса и время действительно, вы также знаете, что идентификатор пользователя использует диспетчер пользователей или вашу службу и меняет пароль пользователя.
Используйте свой класс Repository/UserRepository, чтобы получить объект User из базы данных. Измените объект User и сохраните его с помощью класса EntityManager.
$userRepo = $doctrine->getRepository( 'User' );
$user = $userRepo->find( $userId );
if ( $user !== null ) {
$encryptedPassword = someHowEncryptThePassword( $plainPassword );
$user->setPassword( $encryptedPassword );
$em = $doctrine->getManager();
$em->persist( $user );
$em->flush();
}
На мой взгляд, вы должны хранить уникальную ссылку с отношением к пользователю.
//Quick example
$user = $em->getRepository( 'App:User' )->findByEmail($email);
$lostPassword = new LostPassword();
$lostPassword->setUser($user);
$lostPassword->setHash(uniqid());
//Use hash to send the email to the user here
Предыдущий код - это когда пользователь заполнил форму своим адресом электронной почты. Вы сохраняете пользователя и сгенерированный хеш и отправляете электронное письмо.
В маршруте сброса пароля вам просто нужно получить хеш и выполнить на нем найти
$lostPassword= $em->getRepository( 'App:LostPassword' )->findByHash($hash);
$user = $lostPassword->getUser();
//Your code managment to change the password
Надеюсь это поможет.