Spring Boot集成Keycloak HTTPS环境登录后/sso/login返回403问题
问题根因
核心问题是HTTPS在AWS ALB层终止后,Spring Boot应用及Keycloak适配器无法识别原始请求的HTTPS协议,触发了Keycloak的安全校验规则:
keycloak.ssl-required配置校验失败:你配置的external规则要求外部访问必须走HTTPS,但应用实际拿到的ALB转发请求是HTTP协议,Keycloak适配器直接判定请求不合法返回403。- 回调地址校验不匹配:Keycloak客户端配置的合法回调地址是HTTPS协议,但适配器生成/校验的回调地址基于应用本地的HTTP协议生成,和Keycloak侧配置不一致,直接校验失败。
你本地将keycloak.ssl-required改为all后出现相同403,也是因为本地应用走HTTP协议,不符合all规则要求所有请求必须走HTTPS的校验规则,和部署环境的根因完全一致。
解决方案
1. 配置Spring Boot识别反向代理的原始请求信息
开启对ALB传递的X-Forwarded-*请求头的识别,让应用可以拿到原始请求的协议、域名、端口信息,在配置文件中添加如下配置:
# Spring Boot 2.2+版本使用该配置开启转发头识别 server.forward-headers-strategy=native # Spring Boot 2.2之前的版本使用该配置 # server.use-forward-headers=true # 配置信任的ALB内网网段,避免伪造头攻击,按实际ALB所在网段修改正则即可 server.tomcat.remoteip.internal-proxies=10\.0\.\d{1,3}\.\d{1,3}
AWS ALB默认会自动传递X-Forwarded-Proto、X-Forwarded-Host、X-Forwarded-Port头,无需额外配置ALB规则。配置完成后应用拿到的请求协议会自动识别为https,不再按本地HTTP处理。
2. 确认Keycloak相关配置
- 保持
keycloak.ssl-required=external即可,不需要改为all,该配置允许本地localhost请求走HTTP,线上外部请求强制走HTTPS,符合你的使用场景。 - 若配置完第一步仍有问题,可以显式指定Keycloak回调地址前缀:
keycloak.redirect-uri=https://backo.example.com/*
3. 校验Keycloak客户端配置
登录Keycloak控制台进入backo领域的backo-core客户端配置,确认Valid Redirect URIs项已经添加了https://backo.example.com/*,没有协议写错、漏加通配符的问题。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

