symfony 通过重置密码链接登录的用户错误

uinbv5nw  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(144)

在我的平台上,管理员创建一个用户,密码是随机生成的,这会自动向这个新用户发送一封电子邮件。电子邮件包含一个链接,指向重置密码页面(这将是一个密码创建页面,因为用户不知道他已经生成了密码)。
问题是,当用户单击电子邮件链接并到达更改密码页面时,他以管理员身份登录,因此拥有他不应该拥有的权限。
事实上,我希望电子邮件链接连接到新用户到他的帐户,我不希望他作为管理员登录。我不知道如何做到这一点。
我对令牌不太了解。我相信令牌是基于使用的会话生成的(?)。
下面是创建用户的代码:

/**
     * @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,
        ]);
    }
lyfkaqu1

lyfkaqu11#

这是预期行为,因为:
同一浏览器的多个选项卡/示例在与同一域交互时通常将共享同一服务器端会话。
意味着默认情况下,您不能在不同的选项卡中使用不同的用户登录。
我不认为你会想要这个,只是想想缺点,你真的想再次登录每个标签?这是非常罕见的做法.想象一下,你会打开一个堆栈溢出问题在一个新的标签,你不会登录在那里.
有很多方法可以实现这一点,但如果这是你的实际用例,我不这么认为,你只是在开发你的功能和测试它,在生产中,一个新的用户将不会已经登录为管理员是我的假设。
因此,为了测试您的功能,只需使用私有选项卡(通常不共享相同的服务器端会话)
如果你想了解更多,我发现这个非常酷的线程,用户试图尽可能地解释What are sessions? How do they work?

相关问题