Забыли пароль Symfony без FosUserBundle

Итак, я пытаюсь создать веб-сайт с помощью symfony, у которого есть пользователи. Эти пользователи должны иметь возможность изменять свои пароли из своих учетных записей (это не должно быть трудным, простая форма, которая при отправке изменяет пароль текущего user). Однако я изо всех сил пытаюсь разработать метод реализации «Сброс пароля» "для пользователей, которые полностью забыли свой пароль.

Я планировал отправить пользователям электронное письмо с уникальной ссылкой. При посещении этой ссылки symfony (через тег slug) проверяет, была ли эта ссылка отправлена ​​за последние 5 минут. (возможно, где-нибудь база данных со списком ссылок, раз понадобится логин). тогда пользователю будет предоставлена ​​простая форма, в которой он сможет ввести свой новый пароль, а затем будет перенаправлен на страницу входа.

Моя проблема в том, что я не могу надеяться запустить getUser, когда пользователь фактически не аутентифицирован. Даже если моя база данных времени, ссылок и имен пользователей может указывать на конкретного пользователя, насколько я могу судить, Symfony не будет загружать класс user, пока они не будут должным образом аутентифицированы паролем. Как мне это обойти? Должен ли я просто писать в базу данных вручную без использования класса securityBundle / user? Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
4 075
3

Ответы 3

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

Используйте свой класс 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

Надеюсь это поможет.

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