注册后自动记住我
Posted
技术标签:
【中文标题】注册后自动记住我【英文标题】:Auto remember-me after register 【发布时间】:2021-08-08 19:06:32 【问题描述】:我正在使用 Symfony 5.2 / php8
我的登录表单只是电子邮件 + 密码,我会自动“记住我”使用
firewalls:
endusers:
...
remember_me:
secret: '%kernel.secret'
lifetime: 604800 # 1 week in seconds
path: /
always_remember_me: true
这没有任何问题
问题是在注册过程中,我用这个sn-p自动登录用户
$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' 事件触发更高一级)
所以我想知道如何在上面的案例中设置记住我
【问题讨论】:
【参考方案1】:更新 Symfony 5.3
现在有一个RememberMeHandlerInterface
服务可以与自动装配一起使用,因此您只需注入它并像这样使用它
$rememberMe->createRememberMeCookie($user);
无需更新您的 services.yaml
Symfony 5.2
您可以使用RememberMeServicesInterface
并调用loginSuccess
创建remember_me
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
),以便服务实际创建饼干。
$request->attributes->add(['_remember_me' => true]);
$rememberme->loginSuccess(/*...*/);
【讨论】:
在 Symfony 5.2 中对我不起作用。我收到以下错误:您请求了一个不存在的服务“security.authentication.rememberme.services.simplehash.endusers”。 @dompie 将endusers
更改为您的防火墙名称,很可能是main
。您可以检查您的security.yaml
配置或执行前面提到的console
命令以确保。以上是关于注册后自动记住我的主要内容,如果未能解决你的问题,请参考以下文章