Spring Security整合OAuth2出现重定向循环问题求助
解决Spring OAuth2登录后重定向循环问题
问题根源
你自定义的/oauth2/callback控制器完全多余,Spring Security的oauth2Login()已经内置处理授权码流程的回调逻辑——包括获取token、构建认证会话、跳转回原请求页面。你手动处理回调后重定向到受保护页面时,认证会话还未被Spring Security正确建立,导致访问/my-gui/index.html时再次触发认证流程,形成循环。
修复步骤
删除自定义的OAuthController
直接删掉整个OAuthController类,让Spring Security接管回调处理。调整SecurityFilterChain配置
配置oauth2Login的默认成功跳转页(可选,不配置的话Spring会自动跳转到用户最初请求的页面):
@Configuration public class OAuthSecurityConfiguration { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.anonymous().disable() .authorizeRequests() .antMatchers("/my-gui/**").authenticated() .anyRequest().permitAll() .and() .oauth2Login(oauth2 -> oauth2 // 登录成功后强制跳转到指定页面,第二个参数设为true表示总是跳转,不管原请求 .defaultSuccessUrl("/my-gui/index.html", true) ); return http.build(); } @Bean WebClient webClient(ClientRegistrationRepository clientRegistrationRepository, OAuth2AuthorizedClientRepository authorizedClientRepository) { ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2 = new ServletOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrationRepository, authorizedClientRepository); oauth2.setDefaultOAuth2AuthorizedClient(true); return WebClient.builder() .apply(oauth2.oauth2Configuration()) .build(); } }
- 修正application.yml中的redirect-uri
Spring Security默认的回调路径格式为http://localhost:1234/oauth2/code/{your-client-registration-id},请将redirect-uri修改为对应路径,比如你的client id是oauth-client,则配置:
authorization-grant-type: authorization_code redirect-uri: http://localhost:1234/oauth2/code/oauth-client
如果你坚持使用自定义的/oauth2/callback,需要在oauth2Login中显式配置:
.oauth2Login(oauth2 -> oauth2 .redirectUri("/oauth2/callback") .defaultSuccessUrl("/my-gui/index.html", true) )
原理说明
删除自定义回调后,Spring Security会在回调时自动完成认证会话的构建,此时访问/my-gui/index.html时,SecurityContext中已有合法的认证信息,不会再触发重定向到SSO的流程,循环问题即可解决。
内容的提问来源于stack exchange,提问作者you_know_who
相关产品推荐
相关产品推荐

