没有FosUserBundle的Symfony忘记密码

时间:2018-07-29 10:55:52

标签: php symfony authentication

所以我正在尝试使用symfony创建一个网站,该网站有用户。 这些用户需要能够从自己的帐户中更改密码(这应该不难,这是一种简单的表单,在提交时会更改当前user的密码)。但是,我正在努力设计一种实现方法完全忘记密码的用户的“重置密码”。

我的计划是向用户发送包含唯一链接的电子邮件。访问该链接时,symfony(通过slug标签)检查该链接是否在最近5分钟内发送出去。 (也许某个数据库中包含链接列表,用户名时间)。然后将为用户提供一个简单的表单,供他们输入新密码,然后将其重定向到登录页面。

我的问题是,当用户未通过身份验证时,我不希望运行getUser。就我所知,即使我的时间,链接和用户名数据库可以指向特定用户,Symfony也不会加载user类,除非它们已通过密码正确认证。我该如何解决?是否应该不涉及securityBundle / user类而手动写入数据库?谢谢。

3 个答案:

答案 0 :(得分:1)

您可以随时加载用户。当您在重置页面上并且时间有效时,您还知道用户ID,请使用用户管理器或您的服务,然后更改用户密码。

答案 1 :(得分:1)

使用您的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();

}

答案 2 :(得分:0)

我认为您应该在用户上存储具有关联关系的唯一链接。

//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

希望这会有所帮助。