Spring Boot集成Keycloak OAuth2出现重定向过多问题求助
问题概况
Spring Boot后端搭配Thymeleaf模板引擎,集成Keycloak OAuth2认证。已完成领域创建、重定向URI配置(http://172.31.52.123:8000/*)、用户创建。访问根路径/可正常返回"hi";访问/greeting会跳转到Keycloak登录页,登录后触发ERR_TOO_MANY_REDIRECTS(页面提示「172.31.52.123 hat Sie zu oft weitergeleitet.」),控制台无日志输出,预期登录后重定向回目标页面。
排查与修复方案
1. 修复重定向URI端口不匹配(首要原因)
Keycloak客户端配置的重定向URI是8000端口,但application.properties中redirectUri配置为8080端口:
redirectUri: http://172.31.52.123:8080/*
该错误会导致Keycloak登录成功后回调到未运行应用的8080端口,Spring Security无法处理回调请求,进而触发重复重定向。
修复方式:
将application.properties中的redirectUri修改为与Keycloak一致的端口:
redirectUri: http://172.31.52.123:8000/*
或使用Spring占位符实现动态适配(推荐,避免硬编码):
redirectUri: "{baseUrl}/login/oauth2/code/{registrationId}"
2. 补全用户信息端点配置
当前provider配置缺少user-name-attribute,Spring Security无法正确提取用户身份标识,可能导致认证状态判断异常,引发重定向循环。
修复方式:
在application.properties的provider.appliance节点下添加:
user-name-attribute: preferred_username
(Keycloak默认使用preferred_username作为用户名属性,可根据需求替换为email等其他字段)
3. 优化Security会话管理配置
会话策略异常可能导致认证状态无法正确维护,可显式配置会话规则:
修改SecurityConfig的filterChain方法:
@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeRequests(authorizeRequests -> authorizeRequests .mvcMatchers("/").permitAll() .anyRequest().authenticated() ) .oauth2Login(withDefaults()) .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) ); return http.build(); }
4. 开启调试日志定位细节
控制台无日志时,开启Spring Security与OAuth2的调试日志,可查看重定向流程、认证请求的详细状态:
在application.properties中添加:
logging.level.org.springframework.security=DEBUG logging.level.org.springframework.security.oauth2=DEBUG
启动应用后,通过日志追踪重定向环节的异常点。
5. 检查Keycloak客户端配置
确认Keycloak客户端的Access Type设置为confidential(因为使用authorization_code授权类型且配置了clientSecret),若设置为public会导致认证流程异常。
内容的提问来源于stack exchange,提问作者letsgetraw

