Symfony 6.4中#[AsEventListener]监听OAuth2Events事件异常问题
问题分析与解决方案
你的问题核心是注解配置的事件监听与实际需要监听的事件不匹配,再加上可能存在的注解支持配置遗漏,导致监听器触发时机异常。以下是具体解决步骤:
1. 修正事件常量匹配问题
你在YAML配置中使用的事件是league.oauth2_server.event.authorization_request_resolve,但注解里用的是OAuth2Events::TOKEN_REQUEST_RESOLVE——这是两个完全不同的事件:
AUTHORIZATION_REQUEST_RESOLVE:对应授权请求解析阶段,正是你需要用来引导用户进入授权同意页面的事件TOKEN_REQUEST_RESOLVE:对应令牌请求解析阶段,触发时机晚于授权流程,这就是为什么你的监听器会在请求结束时才触发
修改监听器代码,替换为正确的事件常量:
namespace App\EventListener; use League\Bundle\OAuth2ServerBundle\Event\AuthorizationRequestResolveEvent; use League\Bundle\OAuth2ServerBundle\OAuth2Events; use Symfony\Component\EventDispatcher\Attribute\AsEventListener; final class RequestTokenResolveListener { #[AsEventListener(event: OAuth2Events::AUTHORIZATION_REQUEST_RESOLVE)] public function onLeagueOauth2ServerEventAuthorizationRequestResolve(AuthorizationRequestResolveEvent $event): void { // 根据业务逻辑处理:比如引导未授权用户到同意页面,或直接批准授权 // 示例:若用户已登录且已授权,直接批准;否则重定向到同意页 // if ($this->security->getUser() && $this->isAccessGranted($event->getAuthorizationRequest())) { // $event->resolveAuthorization(true); // } else { // $event->setResponse(new RedirectResponse($this->router->generate('oauth2_authorize'))); // } } }
2. 确保注解支持已启用
在Symfony 6.4中,注解驱动的事件监听需要确保以下配置:
- 安装
symfony/annotations组件(若未安装):composer require symfony/annotations - 在
config/packages/framework.yaml中启用注解支持:framework: annotations: enabled: true
3. 移除冲突的手动配置
删除services.yaml中手动添加的监听器标签配置,避免与注解配置冲突:
# 移除这段配置 services: App\EventListener\RequestTokenResolveListener: tags: - { name: kernel.event_listener, event: league.oauth2_server.event.authorization_request_resolve, method: onLeagueOauth2ServerEventTokenRequestResolve }
4. 验证服务自动注册
Symfony 6.x默认会自动注册src/目录下的所有类为服务,若你没有自定义服务排除规则,监听器类会被自动识别并注册。
内容的提问来源于stack exchange,提问作者saulsluz
相关产品推荐
相关产品推荐

