只触发一次的 Symfony 身份验证事件?
Posted
技术标签:
【中文标题】只触发一次的 Symfony 身份验证事件?【英文标题】:Symfony authentication event that fires only once? 【发布时间】:2020-09-11 20:25:27 【问题描述】:我想记录登录信息。
但是 InteractiveLogin
和 AuthenticationSuccess
事件都会在每个请求上触发(因为我们使用 JWT 进行身份验证,它作为每个请求的标头传递),并且前端在成功的 /api/login
调用后进行重定向,我无法知道用户是否刚刚登录。
你会如何处理这个问题?
【问题讨论】:
【参考方案1】:如果您使用的是无状态防火墙,就像使用 JWT 时一样,经典的 InteractiveLogin
和 AuthenticationSuccess
对此毫无用处。
您要记录的是实际生成令牌的时间。
如果您使用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 - 将安全访问控制设置为只允许匿名身份验证