如何解决注册后自动记住我
我使用的是 Symfony 5.2 / PHP8
我的登录表单只是电子邮件+密码我使用
自动“记住我” firewalls:
endusers:
...
remember_me:
secret: '%kernel.secret'
lifetime: 604800 # 1 week in seconds
path: /
always_remember_me: true
这没有任何问题
问题是在注册过程中,我使用此代码段自动登录用户
$token = new UsernamePasswordToken(
user: $user,credentials: null,firewallName: 'endusers',roles: $user->getRoles(),);
$this->container->get('security.token_storage')->setToken($token);
$this->container->get('session')->set('_security_endusers',serialize($token))
虽然这项工作有效,但不幸的是并没有触发记住我的功能 (这对我的理解是正常的,因为记住我通常会被此处未触发的 'onloginsuccess' 事件触发更高一级)
所以我想知道如何在上面的案例中也设置记住我
解决方法
更新 Symfony 5.3
现在有一个 RememberMeHandlerInterface
服务可以与自动装配一起使用,因此您只需注入它并像这样使用它
$rememberMe->createRememberMeCookie($user);
无需更新 services.yaml
Symfony 5.2
您可以通过使用 RememberMeServicesInterface
并调用 remember_me
来创建 loginSuccess
cookie。
但是,它没有自动装配服务,因此您必须创建别名才能将其注入控制器。
服务的容器别名是 security.authentication.rememberme.services.simplehash.<firewall_name>
。根据配置,它可能不是 simplehash
,您可以通过执行 bin/console debug:container rememberme.services
来验证它。
验证注册服务后,在 config/services.yaml
中创建别名:
services:
# ...
Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface:
alias: security.authentication.rememberme.services.simplehash.endusers
现在您可以在控制器中注入服务并在注册成功后调用该函数。
public function register(Request $request,RememberMeServicesInterface $rememberme,/* Other deps */)
{
$token = new UsernamePasswordToken($user,null,'endusers',$user->getRoles());
$this->container->get('security.token_storage')->setToken($token);
$this->container->get('session')->set('_security_endusers',serialize($token));
// RememberMe needs a Response object so cookies can be set in the output
$response = $this->redirectToRoute($route);
$rememberme->loginSuccess($request,$response,$token);
return $response;
}
根据您的防火墙配置,always_remember_me
已启用,但如果未启用,您需要在请求中设置 remember_me_parameter
(默认为 _remember_me
)实际创建 cookie 的服务。
$request->attributes->add(['_remember_me' => true]);
$rememberme->loginSuccess(/*...*/);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。