SSO 实战系列(3/3):这一篇把 Spring Boot 接 MaxKey 的每个配置项落到具体值上。
和 Keycloak 那篇最大的不同:MaxKey 的发现文档不能直接喂给 Spring 的
issuer-uri,角色也不在 Token 里。这两点如果不提前处理,登录会在很靠后的位置失败。
上篇《Spring Boot 3 接入 Keycloak 实战》讲的是标准 OIDC 的最佳路径。这一篇讲 MaxKey 4.2.0 在同样场景下的实际接法,包括它和标准实现不完全一致的地方。
示例环境:Spring Boot 3.5.x、Spring Security 6.5.x、MaxKey 4.2.0、Java 21、Maven。
本文对比四个免费候选:两个产品型 IdP(Keycloak、MaxKey),两个框架型方案(Sa-Token、Spring Authorization Server)。四个都是 Apache 2.0,都能私有化,但“装完能用”的程度和 License 之外的成本完全不同。
你的项目是 Spring Boot,这一点决定了判断方式:产品型 IdP 只要支持标准 OIDC,Spring 侧接法基本一致;框架型方案则要自己补认证服务和用户体系。所以先看运维成本和开发量,再看许可证。
版本信息查证于 2026-10-25:Keycloak 26.8.1(2026-10-13)、MaxKey 4.2.0(2026-10-21)、Sa-Token 1.46.0(2026-08-19)、Spring Authorization Server 1.5.8(2026-06-09,独立版最后一个版本,后续并入 Spring Security 7)。上线前请以官方页面为准。
语言篇讲语法,运行时篇讲 JVM;这一篇讲工程落地。
Spring 项目的升级难点,通常不在 JDK 21 本身,而在两件事:Spring Boot 2.x → 3.x 的命名空间迁移,以及虚拟线程到底值不值得开、开了为什么可能没效果。
TL;DR
- JDK 17 是 Spring Boot 3 的门票;虚拟线程要 Boot 3.2+。
- 推荐路径:8 → 17(Boot 2.7 验证)→ Boot 3.x → 21,不要把 JDK 和框架放在同一个 PR 里升。
- 最大的机械改动是
javax.*→jakarta.*;最大的认知改动是虚拟线程的适用边界。- 虚拟线程只提升 I/O 密集场景的并发承载;瓶颈会转移到连接池、下游和 CPU。
同一段代码,从 JDK 8 换到 JDK 21,语法一个字没改,行为却可能变:启动时多了一个 InaccessibleObjectException,日志里的中文突然乱码,老 GC 参数不生效,某个脚本引擎找不到实现。
语言篇讲的是“怎么写”,这篇讲“跑起来之后会发生什么”。升级真正让人加班的部分,大多在这里。
TL;DR
- JPMS 对 Spring 应用的真实影响是强封装,不是逼你写
module-info.java。- G1 已是默认;ZGC 适合大堆低延迟,但要压测后再换;容器里优先用
MaxRAMPercentage。- JDK 18 起
file.encoding默认 UTF-8,这是中文项目最容易被忽略的隐性变更。- Java EE/CORBA、CMS、Nashorn 已被移除;CDS 和 JFR 是升级顺带的收益。