symfony 3.3以编程方式登录用户并记住我的功能

时间:2018-04-06 02:51:29

标签: symfony login remember-me

我想在注册成功后登录用户。目前我在网上找到的解决方案是以会话为基础登录用户。但我需要“记住我”的功能。我的研究引导我进入

  

Symfony \ Component \ Security \ Http \ RememberMe \ TokenBasedRememberMeServices

及其功能

  

onLoginSuccess

但我运气不好,最终检测到服务的循环引用。 onLoginSuccess也是受保护的功能。我假设我可以在我自己的函数中复制那些执行登录功能的函数。但这始终不是一个好的选择。所以我想知道是否有人有过这方面的经验?

1 个答案:

答案 0 :(得分:2)

我有自己的答案。 首先,使用以下代码段登录用户

    $user = new \AppBundle\Security\User\EndUser($id, $userKey, $username, $password, $salt, $roles);
    $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
    $this->container->get('security.token_storage')->setToken($token);
    $this->container->get('session')->set('_security_main', serialize($token));

请注意,您自己的userProvider或EndUser可能与我的不同。相应地更改$ user以使其在您自己的情况下工作。

其次,实现记住我的功能。

    $file   = sprintf("%s/config/security.yml", $this->container->getParameter('kernel.root_dir'));
    $parsed = Yaml::parse(file_get_contents($file));
    $options = $parsed['security']['firewalls']['main']['remember_me'];

    $endUserProvider = $this->container->get('AppBundle\Security\User\EndUserProvider');
    $secret = $providerKey = $this->container->getParameter('secret');
    $service = new TokenBasedRememberMeServices(array($endUserProvider), $secret, $providerKey, $options, null);
    $r = new \ReflectionMethod($service, 'onLoginSuccess');
    $r->setAccessible(true);
    $r->invoke($service, $request, $response, $token);

这里有一些解释。上面的代码首先是提取记住我为security.yml配置的,这是启动TokenBasedRememberMeServices实例所需要的。然后使用ReflectionMethod克服可访问的问题,因为onLoginSuccess方法最初受到保护。

此解决方案在symfony 3.3.16下测试。希望这能帮到别人。