只触发一次的 Symfony 身份验证事件?

Posted

技术标签:

【中文标题】只触发一次的 Symfony 身份验证事件?【英文标题】:Symfony authentication event that fires only once? 【发布时间】:2020-09-11 20:25:27 【问题描述】:

我想记录登录信息。

但是 InteractiveLoginAuthenticationSuccess 事件都会在每个请求上触发(因为我们使用 JWT 进行身份验证,它作为每个请求的标头传递),并且前端在成功的 /api/login 调用后进行重定向,我无法知道用户是否刚刚登录。

你会如何处理这个问题?

【问题讨论】:

【参考方案1】:

如果您使用的是无状态防火墙,就像使用 JWT 时一样,经典的 InteractiveLoginAuthenticationSuccess 对此毫无用处。

您要记录的是实际生成令牌的时间

如果您使用lexik/LexikJWTAuthenticationBundle,您可以侦听JWTCreatedEvent 事件以注册用户登录。

class JwtCreatedSubscriber implements EventSubscriberInterface

 public static function getSubscribedEvents(): array
    
        return [
            'lexik_jwt_authentication.on_jwt_created' => 'onJwtCreated'
        ];
    

    public function onJwtCreated(JWTCreatedEvent $event): void
    
        $user = $event->getUser();
        // record your "last logged-in" according depending on your application set-up

    

如果您使用此捆绑包,那么这首先取决于您如何生成令牌。但基本思想是相同的:检查令牌生成并记录那个时间。

需要考虑的一个警告:如果您使用任何类型的“令牌刷新”来维护会话而无需再次登录,则每次刷新会话时,您都会生成一个新令牌...并注册一个新的登录时间。

【讨论】:

这个项目比 lexik 更古老,所以我没有要处理的事件,但我设法覆盖了默认令牌管理器并将我的日志记录注入到创建令牌的位置。谢谢你的想法。

以上是关于只触发一次的 Symfony 身份验证事件?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2中的kernel.request事件中的身份验证令牌始终为空?

用户通过身份验证后触发功能的最佳方式

Symfony2 - 将安全访问控制设置为只允许匿名身份验证

Symfony 命令 - 令牌存储不包含身份验证令牌。一个可能的原因可能是没有为此 URL 配置防火墙

Symfony2 自定义身份验证:用户登录但未通过身份验证

Symfony 5.3 新身份验证不保留我的身份验证