注册后自动记住我

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 命令以确保。

以上是关于注册后自动记住我的主要内容,如果未能解决你的问题,请参考以下文章

C#窗体记住密码和自动登录怎么弄

注销后,身份验证firebase会记住我

spring security实现记住我下次自动登录功能

如何在不注册的情况下记住用户

如何记住 PHP 表单中的文本输入?

怎么记住密码