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

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过滤器链中专门处理认证、授权异常的核心过滤器。

具体流程如下:

  1. 访问/api/protected时,AuthorizationFilter检测到当前用户未认证,直接抛出AccessDeniedException。
  2. ExceptionTranslationFilter捕获到该异常后,判断当前用户处于未认证状态,随即调用配置好的AuthenticationEntryPoint。
  3. 在OAuth2登录场景下,这个入口点是OAuth2AuthorizationRequestRedirectEntryPoint,它会生成HTTP重定向响应,引导浏览器跳转到/oauth2/authorization/discord路径。
  4. 后续由Oauth2AuthorizationRequestRedirectFilter处理这个授权端点请求,最终完成向Discord授权页面的跳转。

本质上,ExceptionTranslationFilter是衔接授权失败与登录流程的关键节点,它通过发送重定向响应让浏览器主动切换URL,而非直接修改请求路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:43:22