Symfony中如何在gesdinet/jwt-refresh-token-bundle处理前获取请求?
在gesdinet/jwt-refresh-token-bundle处理请求前拦截并修改请求的方法
由于新版本的gesdinet/jwt-refresh-token-bundle已弃用原控制器action,改用handler逻辑处理刷新请求,所以KernelEvents::CONTROLLER事件不再触发。推荐以下两种可行方案:
方案一:利用KernelEvents::REQUEST全局请求事件
这是最通用的方式,在请求到达任何处理逻辑前就能拦截,设置高优先级确保在bundle处理前执行:
- 创建事件订阅者类:
// 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并替换默认服务:
- 创建自定义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); } }
- 在
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
相关产品推荐
相关产品推荐

