所以我正在尝试使用symfony创建一个网站,该网站有用户。
这些用户需要能够从自己的帐户中更改密码(这应该不难,这是一种简单的表单,在提交时会更改当前user
的密码)。但是,我正在努力设计一种实现方法完全忘记密码的用户的“重置密码”。
我的计划是向用户发送包含唯一链接的电子邮件。访问该链接时,symfony(通过slug
标签)检查该链接是否在最近5分钟内发送出去。 (也许某个数据库中包含链接列表,用户名时间)。然后将为用户提供一个简单的表单,供他们输入新密码,然后将其重定向到登录页面。
我的问题是,当用户未通过身份验证时,我不希望运行getUser
。就我所知,即使我的时间,链接和用户名数据库可以指向特定用户,Symfony也不会加载user
类,除非它们已通过密码正确认证。我该如何解决?是否应该不涉及securityBundle / user
类而手动写入数据库?谢谢。
答案 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
希望这会有所帮助。