Spring Cloud Gateway未重定向到Keycloak配置的OAuth2回调地址问题
问题根因
- 配置文件中添加了
spring.security.user.name和spring.security.user.password配置,会触发Spring Security默认的表单登录逻辑,优先级高于OAuth2登录,因此未登录请求会被重定向到内置表单登录页/login,而非跳转到Keycloak授权地址。 - 安全配置中没有显式禁用表单登录,也没有明确OAuth2登录的处理逻辑。
修复步骤
1. 删除多余的表单登录配置
删掉application.properties中如下两行配置:
spring.security.user.name=aaa spring.security.user.password=aaa
2. 调整安全配置类
修改SecurityConfig,显式禁用表单登录,完善OAuth2登录逻辑:
package com.example.apigatewayservice; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.web.server.SecurityWebFilterChain; @Configuration @EnableWebFluxSecurity public class SecurityConfig { @Bean public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { http.authorizeExchange(exchanges -> exchanges.anyExchange().authenticated()) // 禁用默认表单登录 .formLogin(ServerHttpSecurity.FormLoginSpec::disable) // 配置OAuth2登录 .oauth2Login(Customizer.withDefaults()) // 适配资源服务器JWT校验逻辑 .oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults())); http.csrf().disable(); return http.build(); } }
3. 补充OAuth2 scope配置(可选)
如果修复后仍有问题,在application.properties中添加scope配置:
spring.security.oauth2.client.registration.spring-cloud-gateway-client.scope=openid,profile,roles
注意事项
请确认Keycloak客户端配置的「Valid Redirect URIs」字段已设置为http://localhost:8090/*,避免授权后回调地址校验失败。
修改完成后重启网关服务,再次访问http://localhost:8090/api/product就会自动跳转到Keycloak登录页,登录成功后会回调你配置的http://localhost:8090/login/oauth2/code/spring-cloud-gateway-client地址完成授权流程。
内容的提问来源于stack exchange,提问作者Haithem Nasri
相关产品推荐
相关产品推荐

