Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 仅触发一次的Symfony身份验证事件?_Php_Symfony_Jwt_Symfony Security - Fatal编程技术网

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更古老,因此我没有可处理的事件,但我成功地覆盖了默认的令牌管理器,并将日志插入到创建令牌的位置。谢谢你的主意。