Spring Security授权重定向端点404问题排查求助
问题:Spring Boot 3 中 OAuth2 授权重定向请求返回404
背景
我们正升级至Spring Boot 3/Spring 6,将原Keycloak适配器授权机制替换为Spring Security(原适配器已废弃),该配置在其他服务均正常运行,但某服务出现异常。
依赖配置
"org.springframework:spring-web:6.0.9", "org.springframework.security:spring-security-config", "org.springframework.security:spring-security-oauth2-client", "org.springframework.security:spring-security-oauth2-jose", "org.springframework.boot:spring-boot-starter-actuator:3.1.1", "org.springframework.boot:spring-boot-starter-oauth2-client", "org.springframework.boot:spring-boot-starter-security"
Spring 配置
spring: security: oauth2: client: registration: keycloak: client-id: ${keycloak.resource} authorization-grant-type: authorization_code scope: openid provider: keycloak client-secret: ${keycloak.credentials.secret} provider: keycloak: issuer-uri: ${keycloak.server.uri} jwk-set-uri: ${keycloak.server.uri}/protocol/openid-connect/certs
Web Security 配置
@EnableWebSecurity @Configuration class WebSecurityConfig { @Bean public SecurityFilterChain authorizeDvUser(final HttpSecurity http) throws Exception { http.formLogin(AbstractHttpConfigurer::disable) .cors(withDefaults()) .csrf(AbstractHttpConfigurer::disable) .headers(h -> h.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)); http.oauth2Login(withDefaults()); http.securityMatcher("/internal/**") .authorizeHttpRequests(req -> req .requestMatchers("/internal/**") .hasRole("our_user")); http.authorizeHttpRequests(req -> req .anyRequest() .permitAll()); return http.build(); } }
问题现象
- 除
/internal/**路径外,其他请求均无需认证(permitAll正常生效)。 - 访问
/internal/**路径时,会被重定向至http://localhost:8444/context_path/oauth2/authorization/keycloak,但该请求返回404。 - 开启调试日志跟踪过滤器链后发现:重定向确实发起,但处理该请求的
OAuth2AuthorizationRequestRedirectFilter从未触发(其他正常服务中该过滤器会正常执行)。 - 该服务与其他服务的区别:无数据库用于会话持久化,默认使用
InMemorySessionRepository(仅单实例运行,满足需求)。
已尝试的方案
手动添加ClientRegistrationRepository Bean,但问题未解决:
@Bean public ClientRegistrationRepository clientRegistrationRepository(final OAuth2ClientProperties clientProperties) { final var mapper = new OAuth2ClientPropertiesMapper(clientProperties); final ClientRegistration keycloak = mapper.asClientRegistrations().get("keycloak"); return new InMemoryClientRegistrationRepository(keycloak); }
疑问
请问该行为的原因是什么?还有哪些排查方向?
内容的提问来源于stack exchange,提问作者daniu
相关产品推荐
相关产品推荐

