Spring Security OAuth2:哪个过滤器负责URL重定向至授权地址?
问题
我配置了如下Spring Security OAuth2登录相关代码:
@EnableWebSecurity @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true) public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests().requestMatchers("/api/protected").authenticated(); http.authorizeHttpRequests().anyRequest().permitAll(); http.oauth2Login((OAuth2LoginConfigurer<HttpSecurity> config) -> { config.redirectionEndpoint((OAuth2LoginConfigurer<HttpSecurity>.RedirectionEndpointConfig redirection) -> { redirection.baseUri("/testauth"); }); }); return http.build(); } @Bean public ClientRegistration clientRegistration() { ClientRegistration cr = ClientRegistration.withRegistrationId("discord") .clientId("1234") .clientSecret("abcd") .scope(new String[]{"email", "identify"}) .authorizationUri("https://discord.com/oauth2/authorize") .tokenUri("https://discord.com/api/oauth2/token") .userInfoUri("https://discord.com/api/v10/users/@me") .userNameAttributeName("username") .clientName("Discord") .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) .redirectUri("http://localhost:8082/testauth") .build(); return cr; } @Bean public ClientRegistrationRepository clientRegistrationRepository() { // maps each ClientRepository to its registrationId return new InMemoryClientRegistrationRepository(clientRegistration()); } }
我想了解访问http://localhost:8082/api/protected时,URL何时变为/oauth2/authorization/discord。通过调试断点发现,Oauth2AuthorizationRequestRedirectFilter处理的请求已经是/oauth2/authorization/discord路径;AuthorizationFilter仅抛出AccessDeniedException拒绝/api/protected请求,并未做跳转。请问哪个过滤器负责将URL从/api/protected变更为/oauth2/authorization/discord?
回答
负责触发这个跳转逻辑的是ExceptionTranslationFilter,它是Spring Security过滤器链中专门处理认证、授权异常的核心过滤器。
具体流程如下:
- 访问
/api/protected时,AuthorizationFilter检测到当前用户未认证,直接抛出AccessDeniedException。 ExceptionTranslationFilter捕获到该异常后,判断当前用户处于未认证状态,随即调用配置好的AuthenticationEntryPoint。- 在OAuth2登录场景下,这个入口点是
OAuth2AuthorizationRequestRedirectEntryPoint,它会生成HTTP重定向响应,引导浏览器跳转到/oauth2/authorization/discord路径。 - 后续由
Oauth2AuthorizationRequestRedirectFilter处理这个授权端点请求,最终完成向Discord授权页面的跳转。
本质上,ExceptionTranslationFilter是衔接授权失败与登录流程的关键节点,它通过发送重定向响应让浏览器主动切换URL,而非直接修改请求路径。
内容的提问来源于stack exchange,提问作者parsecer
相关产品推荐
相关产品推荐

