注册后自动记住我

我正在使用 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

您可以remember_me通过使用RememberMeServicesInterface和调用来创建cookie loginSuccess。但是,它没有自动装配服务,因此您必须创建别名才能将其注入控制器。

该服务的容器别名是security.authentication.rememberme.services.simplehash.<firewall_name>. 根据配置,它可能不是simplehash,您可以通过执行来验证它 bin/console debug:container rememberme.services

验证注册服务后,在config/services.yaml以下位置创建别名:

services:
     # ...
     SymfonyComponentSecurityHttpRememberMeRememberMeServicesInterface:
         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(/*...*/);


以上是注册后自动记住我的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>