注册后自动登录

时间:2018-11-25 15:02:12

标签: php symfony security symfony4

我正在使用symfony4内置的安全系统来制作安全系统。

我将index页上的注册表格整数化。

并处理功能index

中的注册

但是,完成注册后,用户需要再次输入用户名并再次输入密码。

我想跳过此过程。

注册后,用户无需再次输入用户名和密码。

我该如何解决?

public function index(Request $request, UserPasswordEncoderInterface $passwordEncoder)
    {
        $this->commonFunc = $commonFunc;

        $this->data['user'] = $this->getUser();

        if (!$this->data['user']){// make registration form when no login
            $user = new User();
            $form = $this->createForm(UserType::class, $user);

            $form->handleRequest($request);

            if ($form->isSubmitted() && $form->isValid()) {

                $password = $passwordEncoder->encodePassword($user, $user->getPlainPassword());
                $user->setPassword($password);

                // save the User!
                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->persist($user);
                $entityManager->flush();
                $this->data['user'] = $user;

                // After registration process. the user must input id and pass again.
                // I want to skip this.


                return $this->redirectToRoute('index');

            }
            $this->data['form'] = $form->createView();
        }

        return $this->render('default/index.html.twig', [
            'controller_name' => 'DefaultController',
            'data' => $this->data
        ]);
    }

这些是我来自@Cerad建议的最终代码。

我更改了获取tokenStorage的方式(我的环境是4.1) 不知何故,我不需要进行事件调度... 但是可以。

    $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());

// $ this-> tokenStorage-> setToken($ token);         $ this-> get('security.token_storage')-> setToken($ token);

1 个答案:

答案 0 :(得分:2)

这是我使用的:

private function loginUser(Request $request, UserInterface $user) : void
{
    $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
    $this->tokenStorage->setToken($token);

    $event = new InteractiveLoginEvent($request, $token);
    $this->eventDispatcher->dispatch(SecurityEvents::INTERACTIVE_LOGIN, $event);
}

您可以注入令牌存储和事件分发程序,也可以将其从容器中拉出。