编辑
2026-10-25
学习记录
00

目录

一分钟结论
0. 先判断:你真的需要 SSO 吗
1. 两个产品型 IdP 的基本盘
2. “免费”到底免费到什么程度
2.1 Keycloak:Apache 2.0,上游功能完整
2.2 MaxKey:Apache 2.0 社区版,企业版主要卖服务
2.3 四个候选共同的隐性成本
2.4 两个框架型项目:免费,但买的是一套库
2.5 三条硬标准
3. 两个产品型 IdP 的功能对比
3.1 角色:Keycloak 能直接映射,MaxKey 不能
3.2 注销:都能做,但实现方式不同
4. 框架型选项:Sa-Token 与 Spring Authorization Server
4.1 Sa-Token:最轻的登录态共享
4.2 Spring Authorization Server:把认证做进产品
4.3 四个方案怎么归类
5. Spring Boot 接入成本:差别在细节
5.1 Keycloak:配置即接入
5.2 MaxKey:能接,但要手配端点
5.3 代码复用度
6. 按场景怎么选
7. 选 MaxKey 的 POC 清单
8. 结论
参考资料

本文对比四个免费候选:两个产品型 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)。上线前请以官方页面为准。

一分钟结论

你的首要诉求推荐理由
最稳、生态最大、长期维护KeycloakApache 2.0,26.8.1,Spring 资料最多,发现文档完整
中文管理后台、CAS/SAML/SCIM 多协议MaxKeyApache 2.0,4.2.0,国产化场景覆盖更全
团队小、没人愿意维护多套中间件Keycloak单服务 + 数据库即可,组件比 MaxKey 少
已有 LDAP/AD、要中文账号生命周期管理MaxKey组织架构、同步、审计是它的强项
只想让 Spring Boot 少改代码Keycloakissuer-uri 配完就能跑,角色和注销都有现成能力
只有 2~5 个内部 Java 系统,只求登录态共享Sa-TokenApache 2.0,接入最简,但走自有 ticket 协议,不是标准 IdP
有用户中心,要把认证能力做进产品Spring Authorization ServerApache 2.0,标准 OIDC,登录页/用户管理/审计全自研

产品型 IdP 里只选一个:Keycloak。
中文后台是硬指标、或必须兼容 CAS/SAML 存量系统:MaxKey,但先做 POC。
只服务几个内部 Java 系统:Sa-Token 比上面两个都轻。
要把认证产品化:Spring Authorization Server。


0. 先判断:你真的需要 SSO 吗

SSO(Single Sign-On,单点登录)解决的是认证集中的问题,不是权限问题。

出现下面任意一种情况,才值得引入:

  • 有 2 个及以上系统,且使用同一批用户;
  • 有非 Java 系统、移动端或第三方系统需要接入你的用户体系;
  • 需要通过 LDAP / AD / 企业微信 / 钉钉统一登录;
  • 有等保、审计、统一密码策略、MFA 等要求。

如果只有一个系统,或者几个系统用户完全不重叠,直接 Spring Security 表单登录就够了。为了两个内部系统上一套 IdP,通常是过度设计;只是要共享登录态的话,第 4 节的 Sa-Token 更合适。

还有一个常见误区:SSO 只负责“你是谁”,不负责“你能干什么”。每个业务系统仍然需要自己的权限模型,不要把全部业务权限都塞进认证中心。


1. 两个产品型 IdP 的基本盘

维度Keycloak 26.8.1MaxKey 4.2.0
许可证Apache 2.0Apache 2.0
技术栈Java / QuarkusJava / Spring + Tomcat
运行依赖数据库(PostgreSQL 为主)JDK 21+、MySQL 8.4+、Redis、Tomcat
协议OIDC / OAuth2 / SAML 2.0OIDC / OAuth2 / SAML 2.0 / CAS / JWT / SCIM 2.0
管理后台英文为主,可装中文语言包原生中文
部署形态认证服务 + 数据库认证端、管理端、两个前端 + 数据库 + 缓存
生态与资料最多明显较少
适合的团队想要标准、稳定、资料多国内环境、多协议存量系统

两个都不是“轻量工具”,而是完整的 IAM 平台。选它们意味着你愿意承担一套基础设施的运维。


2. “免费”到底免费到什么程度

这是选型里最容易被含糊过去的一段,尤其在国内语境下,“免费”经常和“社区版”“企业版”“信创版”混在一起。

2.1 Keycloak:Apache 2.0,上游功能完整

  • 官方仓库采用 Apache 2.0,可商用、可修改、可私有化,保留版权与许可声明即可;
  • 功能没有按版本切割:OIDC、SAML、身份代理、用户联邦、MFA、授权服务都在上游版本里;
  • 红帽提供的构建版、技术支持、订阅服务是另一条商业线,属于“要不要买服务”,不是“买不买功能”;
  • 因此 Keycloak 的“免费”最干脆:License 不花钱,花的是运维钱。

2.2 MaxKey:Apache 2.0 社区版,企业版主要卖服务

  • 官方仓库同样采用 Apache 2.0,可商用,要求保留原始版权声明;
  • 官网的社区版/企业版对比页给出的口径是:核心功能模块一致,企业版增加的是专属支持、集成咨询、培训、定制开发、界面定制、紧急故障修复等;
  • 也就是说,MaxKey 更像“开源软件 + 商业服务”,而不是“免费版缺功能”;
  • 但涉及国密算法、等保合规材料、特定行业适配时,官方页面没有逐项列清,采购前务必让厂商书面确认哪些在社区版、哪些需要企业版或定制;
  • 不要因为 GitHub 上是 Apache 2.0,就默认所有交付物(文档、合规材料、连接器)都免费。

2.3 四个候选共同的隐性成本

  • 基础设施:数据库、缓存、TLS 证书、备份、监控、日志、负载均衡;
  • 高可用:多实例要共享数据库/缓存,密钥和会话要统一管理;
  • 人力:升级、CVE 补丁、账号问题、登录故障的 on-call;
  • 开发量:框架型方案没有管理台,用户、登录页、审计都得自己写;
  • 迁移:选标准 OIDC 迁移成本低;选私有 ticket 方案基本等于重做;
  • 安全:IdP 是最高价值攻击目标,管理台必须限制来源、开 MFA、独立网络、定期备份签名密钥。

一句话:免费的是 License,不是运维,也不是开发。

2.4 两个框架型项目:免费,但买的是一套库

  • Sa-Token:Apache 2.0,v1.46.0,没有社区版/企业版之分,也没有付费功能墙;项目接受赞助,但功能不按付费切割;
  • Spring Authorization Server:Apache 2.0,同样没有付费功能墙;可选的商业支持是订阅服务,不买也能用全功能;
  • 两者的成本都不在 License,而在“装完不能用”:Sa-Token 需要你已经有登录体系,Spring Authorization Server 需要你自己写登录页、用户管理、同意页、MFA 和审计。

2.5 三条硬标准

不管选哪个,先确认这三件事:

  1. 可商用:许可证允许你所在的组织使用、修改、私有化;
  2. 可退出:对外只暴露标准 OIDC,业务代码不绑 SDK,随时能换(Sa-Token 是例外,这是它最大的代价);
  3. 可维护:有人能升级、能排障、能扛住登录故障,而不是“装上就算完”。

3. 两个产品型 IdP 的功能对比

维度KeycloakMaxKey
登录方式用户名密码、OTP、WebAuthn、社交登录、身份代理用户名密码、OTP、短信、社交登录、扫码等
用户来源内置库、LDAP/AD、Kerberos内置库、LDAP/AD、SCIM、组织架构同步
角色模型Realm 角色、Client 角色、组合角色、组角色、用户组、组织、应用授权
角色是否进 Token是(realm_access.roles、resource_access)否(ID Token 与 UserInfo 都不含角色)
单点注销RP-Initiated Logout、Backchannel LogoutRP 发起注销、/sign/force/logout;backchannel 需按版本确认
多租户Realm 隔离;Organizations机构(instId)隔离
中文后台有语言包,但翻译不全原生中文
授权服务内置 Authorization Services(细粒度策略)以 RBAC + 应用授权为主
扩展方式SPI、自定义 Provider、主题适配器、扩展 API、源码定制
资料可查性高,英文社区大中低,问题更多靠官方文档和源码

两个差异值得单独说明。

3.1 角色:Keycloak 能直接映射,MaxKey 不能

Keycloak 把角色写进 Token,Spring 侧一个 GrantedAuthoritiesMapper 或 JwtAuthenticationConverter 就能变成 ROLE_xxx。

MaxKey 的 OIDC 实现里,ID Token 只有 sub、iss、aud、iat、exp、jti 这些标准声明;UserInfo 按 scope 返回用户名、姓名、部门、邮箱等属性,没有角色字段。所以:

  • 粗粒度可以按 department 之类的属性做映射;
  • 正经做法是登录后按 sub(默认取用户名)到业务库查角色;
  • 指望“在 MaxKey 配好角色,Spring 里 hasRole('admin') 就生效”,在 OIDC 这条路上走不通。

3.2 注销:都能做,但实现方式不同

  • Keycloak 有标准 end_session_endpoint,Spring 的 OidcClientInitiatedLogoutSuccessHandler 可以直接用;
  • MaxKey 的注销入口是 /sign/force/logout?redirect_uri=...,通常要自己写一个 LogoutSuccessHandler 跳过去;
  • 两者默认都只保证“当前应用 + IdP 会话”退出,其他系统的本地 Session 不会自动消失。要即时全局退出,需要 backchannel 或更短的 Session 策略。

4. 框架型选项:Sa-Token 与 Spring Authorization Server

上面两个是“产品型 IdP”:装好就有管理台、用户库、登录页、MFA。下面两个是“框架型”:同样免费,但只给你登录态或协议能力,界面和用户体系要自己补。

4.1 Sa-Token:最轻的登录态共享

  • 版本 v1.46.0(2026-08-19),Apache 2.0,Maven 坐标 cn.dev33:sa-token-sso:1.46.0;
  • 定位是 Java 权限认证框架,SSO 只是其中一个模块;
  • 优点:接入极简,支持同域、跨域、共享 Redis 三种 SSO 模式,中文文档完整;
  • 代价:走自己的 ticket 协议,不是标准 OIDC/SAML;只服务 Java 侧,第三方、非 Java 系统、移动端接入都很弱;以后想换 IdP,基本等于重做;
  • 适合:2~5 个内部 Spring Boot 系统,用户体系完全自己掌握,不对外提供认证。

一句话:它解决“共享登录态”,不解决“对外提供标准身份”。

4.2 Spring Authorization Server:把认证做进产品

  • Apache 2.0,没有付费功能墙;
  • 独立仓库已归档到 spring-attic,最后独立版本 1.5.8(2026-06-09),基于 Spring Framework 6.2 / Spring Security 6.5,对应 Spring Boot 3.5;
  • 后续开发并入 Spring Security 7 的 oauth2-authorization-server 模块,Maven 坐标不变,仍是 org.springframework.security:spring-security-oauth2-authorization-server;7.1.2 已发布,7.2.0-RC1 于 2026-10 发布。Boot 3.x 只能用 1.5.x,Boot 4.x 才用 7.x;
  • 它提供的是协议实现:授权码、PKCE、客户端注册、Token 签发、JWK 轮换、OIDC Discovery;
  • 它不提供用户表、登录页、同意页、MFA、审计、管理后台,这些都要自己写;
  • 适合:已有用户中心,要把认证能力产品化,或需要深度定制 Token 与授权模型。

一句话:免费的是库,不是一套认证服务。

4.3 四个方案怎么归类

维度KeycloakMaxKeySa-TokenSpring Authorization Server
类型产品型 IdP产品型 IdP框架(SSO 模块)框架(授权服务器)
装完能用能能要接自己的登录不能,先写一套
标准 OIDC是是,有差异否是
内建用户与管理台有有无无
免费边界Apache 2.0 全功能Apache 2.0 + 商业服务Apache 2.0Apache 2.0
主要成本运维运维 + 生态小协议锁定开发量
适合多系统、第三方国内多协议内部几个 Java 系统认证产品化

5. Spring Boot 接入成本:差别在细节

很多人以为“都支持 OIDC,接法一样”。对两个产品型 IdP 来说方向没错,但落地时差别不小。

5.1 Keycloak:配置即接入

yaml
spring: security: oauth2: client: registration: keycloak: provider: keycloak client-id: blog-web client-secret: ${KEYCLOAK_CLIENT_SECRET} authorization-grant-type: authorization_code scope: openid,profile,email provider: keycloak: issuer-uri: http://localhost:8080/realms/blog
  • 发现文档完整,授权端点、Token 端点、JWK、UserInfo、注销端点都能自动拿到;
  • 角色在 realm_access.roles;
  • 注销用现成的 handler。

5.2 MaxKey:能接,但要手配端点

MaxKey 4.2.0 的发现文档位于 /sign/authz/oauth/v20/.well-known/openid-configuration,而 Spring Security 会把 issuer-uri 拼成 <issuer>/.well-known/openid-configuration,并且要求发现文档里的 issuer 与配置值完全一致。MaxKey 在不带 client_id 参数时返回的 issuer 是带 /maxkey 的上下文形态,两边对不上,所以直接用 issuer-uri 会报 issuer 不匹配。

实际可行的做法是显式配置端点:

yaml
spring: security: oauth2: client: provider: maxkey: authorization-uri: http://localhost:9527/sign/authz/oauth/v20/authorize token-uri: http://localhost:9527/sign/authz/oauth/v20/token user-info-uri: http://localhost:9527/sign/api/connect/v10/userinfo jwk-set-uri: http://localhost:9527/sign/authz/oauth/v20/jwks

此外还有三个默认值必须先改,否则登录大概率失败:

  1. scope 默认只有 read:要手动加上 openid、profile、email,否则拿不到 ID Token;
  2. 签名算法默认是空:不选算法时 ID Token 不带签名,Spring 校验会失败,要选 RS256;
  3. UserInfo 返回格式默认是 JWT:Spring 按 JSON 解析用户信息,建议把返回格式改成 NORMAL(JSON)。

这些都是配置层面的成本,不是写代码的成本,但第一次接的人很容易卡在这儿。

5.3 代码复用度

登录、Session、权限控制、注销这些 Spring 侧结构可以复用,但不能只改 issuer-uri 就切换。从 Keycloak 换到 MaxKey,至少要改:

  • provider 配置(发现 → 显式端点);
  • 角色来源(Token claim → 业务库查询);
  • 注销处理(标准 handler → 自定义跳转);
  • 用户信息取值(claims 名称不同)。

6. 按场景怎么选

如果目标是“把认证能力做进产品”,下面这棵树不适用,直接看 Spring Authorization Server。

text
只有 2~5 个内部 Java 系统,且不接第三方? ├─ 是 → Sa-Token(最轻,但锁在自有协议上) └─ 否 → 有中文管理后台的硬性要求吗? ├─ 有 → 需要 CAS/SAML/SCIM 等存量协议吗? │ ├─ 需要 → MaxKey(先 POC) │ └─ 不需要 → 能接受多维护 MySQL + Redis + Tomcat 吗? │ ├─ 能 → MaxKey │ └─ 不能 → Keycloak └─ 没有 → 团队更看重资料多、踩坑少吗? ├─ 是 → Keycloak └─ 否 → 两个都可以,按运维习惯选

更直接的判断:

  1. 多系统、多端、要接第三方、长期维护:Keycloak;
  2. 国内政企、中文后台、CAS/SAML/OIDC 混合:MaxKey;
  3. 团队没有专职中间件运维:Keycloak,组件更少;
  4. 已有 LDAP/AD,且需要中文账号生命周期界面:MaxKey;
  5. 只是 2~5 个内部 Spring Boot 系统共享登录态:Sa-Token,比上两个都轻;
  6. 已有用户中心,要把认证能力产品化:Spring Authorization Server(Boot 3.5 用 1.5.x,Boot 4 用 7.x);
  7. 要强定制但不想自己写协议:在 Keycloak/MaxKey 上做扩展,而不是自研。

7. 选 MaxKey 的 POC 清单

如果你倾向 MaxKey,不要只看官网截图,至少验证这 8 件事。

  1. OIDC 端点:授权、Token、UserInfo、JWKS 是否都能访问;Spring 用显式端点能否完成登录。
  2. scope 与 Token:加上 openid,profile,email 后,ID Token 的 alg 是不是 RS256,aud 是否等于 clientId。
  3. UserInfo 格式:返回 JSON 还是 JWT;字段名是否符合预期(例如 preferred_username 取的是显示名,不是登录名)。
  4. 角色来源:确认 Token 里没有角色后,业务侧的授权方案是什么。
  5. 注销:/sign/force/logout 是否按预期清理 IdP 会话并跳回业务系统。
  6. LDAP/AD/SCIM:同步方向、字段映射、禁用用户是否及时生效。
  7. 审计与备份:登录日志、管理操作日志、数据库与签名密钥的备份恢复。
  8. 付费边界:国密、等保材料、行业适配、厂商支持,逐项书面确认。

再加一条:退出预案。对外只暴露标准 OIDC,不要把业务代码绑死在某个产品的 SDK 上。


8. 结论

这不是说 MaxKey 不好。它在中文后台、多协议兼容、国产化场景上确实有优势,Apache 2.0 也足够干净。问题在于:它的生态和“Spring Boot 开箱即用”的程度不如 Keycloak,你需要为这些差异付出配置和排障成本。

Sa-Token 和 Spring Authorization Server 同样免费,但没有放进本系列的实战:前者走自有协议,后者要自己补齐用户体系。如果你的场景已经明确落在“内部几个 Java 系统”或“认证产品化”上,直接按第 4 节选就行,不必先跟着跑 Keycloak。

本系列的选择是:

  • Keycloak 作为基准,先把标准 OIDC 接法讲透;
  • MaxKey 单独写一篇,把上面提到的端点、签名、UserInfo、角色问题逐个落到配置和代码上。

接下来的两篇:

  • 《Spring Boot 3 接入 Keycloak 实战》:Docker 启动、客户端配置、SecurityConfig、角色映射、单点注销;
  • 《Spring Boot 3 接入 MaxKey 实战》:应用注册、显式端点、签名与 UserInfo 格式、无角色 claim 时的授权方案、注销跳转。

参考资料

本文作者:Weee

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!