从控制器访问 JWT 数据的有效方法

Efficient way to access JWT data from Controllers

我将 Symfony 5.4 与自定义身份验证器一起使用,该身份验证器读取并验证每个请求的 JWT。

JWT 内部是我需要在控制器中访问的数据。

我不想在控制器中重新读取 JWT,而是希望存储解码后的数据,甚至是该数据的 1 个元素,这样就不需要在控制器中重新读取了。

访问在身份验证器中检测到的数据以便在控制器操作的上下文中可用的有效方法是什么?

我会在 Symfony 中为此实现服务,应该是这样的

<?php

namespace App\Service;

use Symfony\Component\HttpFoundation\RequestStack;

class JWTInterceptor
{
    protected $request;

    protected $data;

    public function __construct(RequestStack $requestStack)
    {
        $this->request = $requestStack->getCurrentRequest();
        // Get JWT token from request header, decode and store it in $this->data
    }

    // Get decoded data
    public function getData()
    {
        return $this->data;
    }
}

并且在您的控制器中只需使用依赖注入来插入服务并调用 JWTInterceptor::getData() 以使用解码数据。

也应该有其他方法,比如使用 EventListener or EventSubscriber 或使用相关方法实现一个 root/base 控制器并使所有子控制器都可以访问它等。

或者,如果您使用的是 https://github.com/lexik/LexikJWTAuthenticationBundle,它已经与事件打包在一起,因此您可以根据需要进行修改。