keycloak admin console打不开主因是服务未启动或端口冲突,需用./kc.sh start-dev启动并确认jdk 17+;spring boot 3.x须弃用旧starter,手动集成security 6并配置jwt解析;token缺失用户属性需在client scope中添加user attribute mapper。

Keycloak Admin Console打不开,提示“Connection refused”
本地启动后浏览器访问 http://localhost:8080 失败,大概率是服务根本没跑起来,或者端口被占。Keycloak 21+ 默认使用 Quarkus 运行时,不再依赖外部 Tomcat,启动日志里不会出现 “Started Server” 这类传统提示,容易误判。
- 检查启动命令是否正确:
./kc.sh start-dev(Linux/macOS)或kc.bat start-dev(Windows),不是./standalone.sh - 确认 Java 版本:Keycloak 22 要求 JDK 17+,运行
java -version验证,JDK 11 或 21 混用会导致静默失败 - 端口冲突时,改用
./kc.sh start-dev --http-port=8180,别直接改conf/keycloak.conf—— dev 模式下该文件被忽略 - 首次启动会生成
data/conf/keycloak.conf,但只在start(非start-dev)时生效;开发阶段一切配置优先走命令行参数
Java 应用接入 Keycloak,spring-boot-starter-keycloak 报 NoClassDefFoundError: org/keycloak/adapters/springsecurity/KeycloakSecurityComponents
这是 Spring Boot 3.x + Keycloak 22 的典型兼容问题。官方 spring-boot-starter-keycloak 停留在 Spring Security 5,不支持 Spring Security 6 的新过滤器链模型,强行引入只会类加载失败。
- Spring Boot 3.1+ 必须换用
keycloak-admin-client(管理 API)+ 手动集成 Spring Security 6,不能 依赖旧 starter - 用户认证流程要自己写
KeycloakJwtAuthenticationConverter,把 JWT 中的realm_access.roles映射成GrantedAuthority,否则@PreAuthorize("hasRole('ADMIN')")无效 -
application.yml里删掉所有keycloak.开头的配置项,它们对新集成方式无意义 - 调试时打开
logging.level.org.springframework.security=DEBUG,看是否卡在BearerTokenResolver或JwtDecoder初始化阶段
Keycloak 登录后重定向到应用首页,但页面显示 “Unauthorized” 或 403
不是 Token 没传,而是资源服务器(你的 Java 应用)校验 Token 时,没匹配上 Keycloak 里 Client 的 Client ID 或 Realm 的公钥。JWT header 中的 kid 对不上,解签直接失败。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 确保应用使用的 Realm Public Key 和 Keycloak Admin Console → Realm Settings → Keys → Public Key 里的内容**完全一致**(含换行和空格)
- Client 的
Client ID(如myapp)必须和应用配置中keycloak.resource(旧方式)或spring.security.oauth2.resourceserver.jwt.issuer-uri后拼接的路径一致 - 如果用了自定义 Token 签发密钥(非 realm key),需在应用侧显式配置
spring.security.oauth2.resourceserver.jwt.jwk-set-uri指向https://host/auth/realms/{realm}/protocol/openid-connect/certs - 浏览器开发者工具 Network 标签里点开请求,看 Authorization Header 是否带了 Bearer Token;没带说明前端没转发,跟后端配置无关
Keycloak 用户属性(如 phone、department)在 Java 应用里取不到
Keycloak 默认只在 ID Token 和 UserInfo 响应里放基础字段(sub、email、name),自定义属性默认不透出。不是代码漏读,是 Token 根本没包含。
- 进 Keycloak Admin Console → Users → 选中用户 → Attributes 标签页添加键值对后,还需配置 Client Scope → Mappers → Create → Mapper Type 选 “User Attribute”,勾选 “Add to ID token” 和 “Add to access token”
- Mapper 的 “User Attribute” 填的是 key 名(如
phone),而 “Token Claim Name” 是最终出现在 JWT payload 里的字段名(可不同,但建议一致) - Java 侧从
SecurityContextHolder.getContext().getAuthentication().getPrincipal()拿到的是KeycloakPrincipal,调getKeycloakSecurityContext().getToken().getOtherClaims()才能读自定义字段 - 若用 Spring Security 6 的
JwtAuthenticationToken,则通过getAttributes().get("phone")获取,前提是前面 mapper 已启用且 token 包含该 claim
Keycloak 的配置分散在 Realm、Client、Client Scope、User Federation 多个层级,改一处常要联动三处;最常被跳过的一步是 Client Scope Mapper 没绑定到 Client,结果 Token 空空如也,查半天代码也没用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










