symfony 3.3 以编程方式登录具有记住我功能的用户
symfony 3.3 programmatically login a user with remember me feature
我想在注册成功后登录一个用户。目前我在网上找到的解决方案是在会话基础上登录用户。但我需要 "remember me" 功能。我的研究将我带到
Symfony\Component\Security\Http\RememberMe\TokenBasedRememberMeServices
及其功能
onLoginSuccess
但我运气不好,最终检测到服务的循环引用。 onLoginSuccess 也是受保护的功能。我假设我可以在我自己的函数中复制这些函数来执行登录功能。但这始终不是一个好的选择。所以我想知道是否有人有这方面的经验?
在这里我有了自己的答案。
首先,使用以下代码段
登录用户
$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);
这里有一些解释。上面的代码首先是获取启动 TokenBasedRememberMeServices 实例所需的 security.yml 的记住我配置。然后使用 ReflectionMethod 来克服访问问题,因为方法 onLoginSuccess 最初是受保护的。
此解决方案已在 symfony 3.3.16 下测试。希望这对其他人有帮助。
我想在注册成功后登录一个用户。目前我在网上找到的解决方案是在会话基础上登录用户。但我需要 "remember me" 功能。我的研究将我带到
Symfony\Component\Security\Http\RememberMe\TokenBasedRememberMeServices
及其功能
onLoginSuccess
但我运气不好,最终检测到服务的循环引用。 onLoginSuccess 也是受保护的功能。我假设我可以在我自己的函数中复制这些函数来执行登录功能。但这始终不是一个好的选择。所以我想知道是否有人有这方面的经验?
在这里我有了自己的答案。 首先,使用以下代码段
登录用户 $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);
这里有一些解释。上面的代码首先是获取启动 TokenBasedRememberMeServices 实例所需的 security.yml 的记住我配置。然后使用 ReflectionMethod 来克服访问问题,因为方法 onLoginSuccess 最初是受保护的。
此解决方案已在 symfony 3.3.16 下测试。希望这对其他人有帮助。