在我的平台上,管理员创建一个用户,密码是随机生成的,这会自动向这个新用户发送一封电子邮件。电子邮件包含一个链接,指向重置密码页面(这将是一个密码创建页面,因为用户不知道他已经生成了密码)。
问题是,当用户单击电子邮件链接并到达更改密码页面时,他以管理员身份登录,因此拥有他不应该拥有的权限。
事实上,我希望电子邮件链接连接到新用户到他的帐户,我不希望他作为管理员登录。我不知道如何做到这一点。
我对令牌不太了解。我相信令牌是基于使用的会话生成的(?)。
下面是创建用户的代码:
/**
* @Route("/new", name="user_new", methods={"GET", "POST"})
* @throws TransportExceptionInterface
*/
public function new(Request $request, MailSender $mailSender,UserPasswordHasherInterface $passwordHasher): Response
{
// TODO CHECK IF USER ALREADY EXISTS BY EMAIL
$user = new User();
$form = $this
->createForm(UserType::class, $user)
->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// TODO GENERATE RANDOM PASSWORD
//$passwordHasher->hashPassword($user, $user->getPassword()));
$user->setPassword($passwordHasher->hashPassword($user, "password"));
$this->entityManager->persist($user);
$this->entityManager->flush();
try {
$resetToken = $mailSender->makeToken($user);
} catch (ResetPasswordExceptionInterface $e) {
return $this->redirectToRoute('user_new');
}
$mailInfos = array('template'=>"reset_password/email_activate.html.twig", 'subject'=>"Activer votre compte", 'email'=>$user->getEmail());
$mailSender->sendMail($resetToken, $mailInfos);
$mailSender->storeToken($resetToken);
return $this->redirectToRoute('user_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('user/new.html.twig', [
'user' => $user,
'form' => $form,
]);
}
1条答案
按热度按时间lyfkaqu11#
这是预期行为,因为:
同一浏览器的多个选项卡/示例在与同一域交互时通常将共享同一服务器端会话。
意味着默认情况下,您不能在不同的选项卡中使用不同的用户登录。
我不认为你会想要这个,只是想想缺点,你真的想再次登录每个标签?这是非常罕见的做法.想象一下,你会打开一个堆栈溢出问题在一个新的标签,你不会登录在那里.
有很多方法可以实现这一点,但如果这是你的实际用例,我不这么认为,你只是在开发你的功能和测试它,在生产中,一个新的用户将不会已经登录为管理员是我的假设。
因此,为了测试您的功能,只需使用私有选项卡(通常不共享相同的服务器端会话)
如果你想了解更多,我发现这个非常酷的线程,用户试图尽可能地解释What are sessions? How do they work?