You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony中如何在gesdinet/jwt-refresh-token-bundle处理前获取请求?

在gesdinet/jwt-refresh-token-bundle处理请求前拦截并修改请求的方法

由于新版本的gesdinet/jwt-refresh-token-bundle已弃用原控制器action,改用handler逻辑处理刷新请求,所以KernelEvents::CONTROLLER事件不再触发。推荐以下两种可行方案:

方案一:利用KernelEvents::REQUEST全局请求事件

这是最通用的方式,在请求到达任何处理逻辑前就能拦截,设置高优先级确保在bundle处理前执行:

  1. 创建事件订阅者类:
// src/EventSubscriber/RefreshTokenRequestSubscriber.php
namespace App\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class RefreshTokenRequestSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            // 设置255的高优先级,确保先于bundle的处理逻辑执行
            KernelEvents::REQUEST => ['onKernelRequest', 255],
        ];
    }

    public function onKernelRequest(RequestEvent $event): void
    {
        $request = $event->getRequest();
        
        // 仅针对刷新令牌的请求路径(默认是/refresh_token,根据你的路由配置调整)
        if ($request->getPathInfo() !== '/refresh_token') {
            return;
        }

        // 在这里修改请求,比如调整参数、Headers等
        $request->headers->set('X-Custom-Header', 'modified-value');
        // 示例:修改POST参数
        $params = $request->request->all();
        $params['some_key'] = 'updated_value';
        $request->request->replace($params);
    }
}

Symfony会自动注册这个订阅者(只要放在src/EventSubscriber目录下),无需额外配置。

方案二:替换bundle默认的RefreshTokenHandler

如果需要更贴近bundle的处理流程,可以自定义handler并替换默认服务:

  1. 创建自定义handler类:
// src/Handler/CustomRefreshTokenHandler.php
namespace App\Handler;

use Gesdinet\JWTRefreshTokenBundle\Request\Extractor\RequestExtractorInterface;
use Gesdinet\JWTRefreshTokenBundle\Service\RefreshTokenHandlerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class CustomRefreshTokenHandler implements RefreshTokenHandlerInterface
{
    public function __construct(
        private RefreshTokenHandlerInterface $defaultHandler,
        private RequestExtractorInterface $requestExtractor
    ) {}

    public function handle(Request $request): Response
    {
        // 在bundle处理前修改请求
        $refreshToken = $this->requestExtractor->getRefreshToken($request);
        if ($refreshToken) {
            // 示例:对刷新令牌做预处理
            $modifiedToken = strtoupper($refreshToken);
            $request->request->set('refresh_token', $modifiedToken);
        }

        // 调用默认handler完成后续逻辑
        return $this->defaultHandler->handle($request);
    }
}
  1. 在config/services.yaml中替换默认服务:
services:
    Gesdinet\JWTRefreshTokenBundle\Service\RefreshTokenHandlerInterface:
        class: App\Handler\CustomRefreshTokenHandler
        arguments:
            $defaultHandler: '@Gesdinet\JWTRefreshTokenBundle\Service\DefaultRefreshTokenHandler'
            $requestExtractor: '@Gesdinet\JWTRefreshTokenBundle\Request\Extractor\RequestExtractorInterface'

两种方案中,方案一更灵活通用,方案二更贴合bundle的内部逻辑,可根据需求选择。

内容的提问来源于stack exchange,提问作者Tomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 03:23:20