symfony 3.3使用“记住我”功能以编程方式登录用户

symfony 3.3使用“记住我”功能以编程方式登录用户,symfony,login,remember-me,Symfony,Login,Remember Me,我想在注册成功后登录一个用户。目前,我在网上找到的解决方案是在会话基础上登录用户。但我需要“记住我”的功能。我的研究使我找到了答案 Symfony\Component\Security\Http\Memberme\TokenBasedMemberMeservices 及其功能 唯一成功 但我运气不好,最后检测到循环引用进行服务。此外,onloginsucess是受保护的功能。我假设我可以在自己的函数中复制这些函数,在其中执行登录功能。但这永远不是一个好的选择。所以我想知道是否有人在这方面有经验?

我想在注册成功后登录一个用户。目前,我在网上找到的解决方案是在会话基础上登录用户。但我需要“记住我”的功能。我的研究使我找到了答案

Symfony\Component\Security\Http\Memberme\TokenBasedMemberMeservices

及其功能

唯一成功

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

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

    $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));
请注意,您自己的用户提供者或最终用户可能与我的不同。相应地更改$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的fetch MemberMe配置,它是启动TokenBasedMemberMeservices实例所需的。然后使用ReflectionMethod克服可访问性问题,因为方法onLoginSucess最初是受保护的


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

使用
ReflectionMethod
是完成工作的一个非常巧妙的解决方法!使用SF4,我必须将
UserProviderInterface
作为
$endUserProvider
注入以使其工作。