Php 仅触发一次的Symfony身份验证事件?
我想登录 但是,Php 仅触发一次的Symfony身份验证事件?,php,symfony,jwt,symfony-security,Php,Symfony,Jwt,Symfony Security,我想登录 但是,InteractiveLogin和AuthenticationSuccess事件都会在每个请求上触发(因为我们使用JWT进行身份验证,它作为每个请求的头传递),并且前端在成功的/api/login调用后进行重定向,我无法知道,用户是否刚刚登录 class JwtCreatedSubscriber implements EventSubscriberInterface { public static function getSubscribedEvents(): array
InteractiveLogin
和AuthenticationSuccess
事件都会在每个请求上触发(因为我们使用JWT进行身份验证,它作为每个请求的头传递),并且前端在成功的/api/login
调用后进行重定向,我无法知道,用户是否刚刚登录
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
}
}
您将如何处理这一问题?如果您使用的是无状态防火墙,就像使用JWT时一样,经典的
InteractiveLogin
和AuthenticationSuccess
对此毫无用处
当令牌实际生成时,您要记录的是
如果正在使用,则可以侦听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更古老,因此我没有可处理的事件,但我成功地覆盖了默认的令牌管理器,并将日志插入到创建令牌的位置。谢谢你的主意。