只触发一次的 Symfony 身份验证事件?
Symfony authentication event that fires only once?
我想登录。
但是 InteractiveLogin
和 AuthenticationSuccess
事件都会在每个请求上触发(因为我们使用 JWT 进行身份验证,它作为每个请求的 header 传递),并且前端确实/api/login
调用成功后的重定向,我无法知道用户是否 刚刚 登录。
你会如何处理这个问题?
如果你使用的是无状态防火墙,就像使用 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
}
}
如果您不 使用此捆绑包,那么,这首先取决于您如何生成令牌。但基本思想是相同的:检查令牌生成并记录 那个 时间。
需要考虑的警告:如果您使用任何类型的 "token refresh" 来维护会话而无需再次登录,则每次刷新会话时都会生成一个新令牌...并注册一个新的登录时间。
我想登录。
但是 InteractiveLogin
和 AuthenticationSuccess
事件都会在每个请求上触发(因为我们使用 JWT 进行身份验证,它作为每个请求的 header 传递),并且前端确实/api/login
调用成功后的重定向,我无法知道用户是否 刚刚 登录。
你会如何处理这个问题?
如果你使用的是无状态防火墙,就像使用 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
}
}
如果您不 使用此捆绑包,那么,这首先取决于您如何生成令牌。但基本思想是相同的:检查令牌生成并记录 那个 时间。
需要考虑的警告:如果您使用任何类型的 "token refresh" 来维护会话而无需再次登录,则每次刷新会话时都会生成一个新令牌...并注册一个新的登录时间。