20 年沉淀,CAS 8.0 重新定义企业级 SSO:适配 JDK 25 与 Spring Boot 4.1
很少有人会想起一款已经活了二十多年、至今仍保持高频发版的开源身份中间件:Apereo CAS 。它绝非过时的历史包袱------2026 年 7 月 18 日 CAS 8.0.0 正式 GA,8 月 14 日发布 8.0.1 补丁,8 月 28 日 8.1.0 首个候选版上线,底层直接对齐 JDK 25 与 Spring Boot 4.1。
一、开源出身:从耶鲁校园项目到基金会旗舰平台
CAS 全称 Central Authentication Service ,最早诞生于 2004 年前后的耶鲁大学,初衷是解决校园内数十个系统重复登录的问题。后来项目捐赠给专注教育与非营利领域的 Apereo 基金会 ,代码托管在 GitHub,采用 Apache License 2.0 协议,商用、二开、闭源衍生均无传染性限制,仅需保留版权声明。
| 项目属性 | 说明 |
|---|---|
| 治理模式 | PMC 治理,核心贡献者来自多家身份基础设施厂商与高校工程师 |
| 协议独立性 | CAS 协议独立于实现,Java、.NET、PHP、Python 等主流语言都有客户端 |
| 用户范围 | 早已超出教育行业,大量政府、金融、医疗和大型企业的内网 SSO 都运行在 CAS 之上 |
这种出身决定了它的基因:天生面向异构系统多、厂商多、身份关系复杂、合规要求高的场景。
二、2026 版本线:两条基线,选错麻烦半年
目前 CAS 有两条活跃版本线,选型错了可能平添半年运维成本:
#mermaid-svg-OEnINvCbf2RKYhku{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OEnINvCbf2RKYhku .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OEnINvCbf2RKYhku .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OEnINvCbf2RKYhku .error-icon{fill:#552222;}#mermaid-svg-OEnINvCbf2RKYhku .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OEnINvCbf2RKYhku .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OEnINvCbf2RKYhku .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OEnINvCbf2RKYhku .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OEnINvCbf2RKYhku .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OEnINvCbf2RKYhku .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OEnINvCbf2RKYhku .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OEnINvCbf2RKYhku .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OEnINvCbf2RKYhku .marker.cross{stroke:#333333;}#mermaid-svg-OEnINvCbf2RKYhku svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OEnINvCbf2RKYhku p{margin:0;}#mermaid-svg-OEnINvCbf2RKYhku .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OEnINvCbf2RKYhku .cluster-label text{fill:#333;}#mermaid-svg-OEnINvCbf2RKYhku .cluster-label span{color:#333;}#mermaid-svg-OEnINvCbf2RKYhku .cluster-label span p{background-color:transparent;}#mermaid-svg-OEnINvCbf2RKYhku .label text,#mermaid-svg-OEnINvCbf2RKYhku span{fill:#333;color:#333;}#mermaid-svg-OEnINvCbf2RKYhku .node rect,#mermaid-svg-OEnINvCbf2RKYhku .node circle,#mermaid-svg-OEnINvCbf2RKYhku .node ellipse,#mermaid-svg-OEnINvCbf2RKYhku .node polygon,#mermaid-svg-OEnINvCbf2RKYhku .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OEnINvCbf2RKYhku .rough-node .label text,#mermaid-svg-OEnINvCbf2RKYhku .node .label text,#mermaid-svg-OEnINvCbf2RKYhku .image-shape .label,#mermaid-svg-OEnINvCbf2RKYhku .icon-shape .label{text-anchor:middle;}#mermaid-svg-OEnINvCbf2RKYhku .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OEnINvCbf2RKYhku .rough-node .label,#mermaid-svg-OEnINvCbf2RKYhku .node .label,#mermaid-svg-OEnINvCbf2RKYhku .image-shape .label,#mermaid-svg-OEnINvCbf2RKYhku .icon-shape .label{text-align:center;}#mermaid-svg-OEnINvCbf2RKYhku .node.clickable{cursor:pointer;}#mermaid-svg-OEnINvCbf2RKYhku .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OEnINvCbf2RKYhku .arrowheadPath{fill:#333333;}#mermaid-svg-OEnINvCbf2RKYhku .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OEnINvCbf2RKYhku .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OEnINvCbf2RKYhku .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OEnINvCbf2RKYhku .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OEnINvCbf2RKYhku .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OEnINvCbf2RKYhku .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OEnINvCbf2RKYhku .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OEnINvCbf2RKYhku .cluster text{fill:#333;}#mermaid-svg-OEnINvCbf2RKYhku .cluster span{color:#333;}#mermaid-svg-OEnINvCbf2RKYhku div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OEnINvCbf2RKYhku .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OEnINvCbf2RKYhku rect.text{fill:none;stroke-width:0;}#mermaid-svg-OEnINvCbf2RKYhku .icon-shape,#mermaid-svg-OEnINvCbf2RKYhku .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OEnINvCbf2RKYhku .icon-shape p,#mermaid-svg-OEnINvCbf2RKYhku .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OEnINvCbf2RKYhku .icon-shape .label rect,#mermaid-svg-OEnINvCbf2RKYhku .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OEnINvCbf2RKYhku .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OEnINvCbf2RKYhku .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OEnINvCbf2RKYhku :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} CAS 7.3 维护线
7.3.8.2 于 2026 年 9 月发布
要求:JDK 21
适配企业常规 LTS 技术栈
仍在安全维护窗口内
CAS 8.0 新世代线
8.0.0 于 2026 年 7 月 GA
8.0.1 补丁已发布
基线:JDK 25
依赖:Spring Framework 7.0
Spring Boot 4.1
Spring Security 7.1
| 版本线 | 最新版本 | JDK 基线 | Spring 生态 | 适用场景 |
|---|---|---|---|---|
| 8.0 新世代线 | 8.0.1 | JDK 25 | Spring Framework 7.0 / Boot 4.1 / Security 7.1 | 新项目、正在做 JDK 25 升级的团队 |
| 7.3 维护线 | 7.3.8.2 | JDK 21 | 企业常规 LTS 技术栈 | 生产环境偏保守、JDK 基线停在 21 的团队 |
发布节奏与 EOL
CAS 采用严格的时间驱动发布:
- 每个小版本发布后 六个月内接受 bug 修复 + 安全补丁
- 之后 六个月仅收安全补丁
- 通常同时保持三条活跃分支
选型建议 :新项目或正在做 JDK 25、Spring Boot 4.1 升级的团队,直接选 8.0.1 ;生产环境偏保守、JDK 基线停在 21 的团队,7.3.8.2 是最稳妥的选择,但要盯住六个月的 EOL 节奏,避免落在停止维护的版本上。
三、整体架构:收敛攻击面的核心设计
CAS 系统分为两个物理部件:CAS Server 和 CAS Client。
#mermaid-svg-A5RCH6JLg9XHs5UF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-A5RCH6JLg9XHs5UF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-A5RCH6JLg9XHs5UF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-A5RCH6JLg9XHs5UF .error-icon{fill:#552222;}#mermaid-svg-A5RCH6JLg9XHs5UF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-A5RCH6JLg9XHs5UF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-A5RCH6JLg9XHs5UF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-A5RCH6JLg9XHs5UF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-A5RCH6JLg9XHs5UF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-A5RCH6JLg9XHs5UF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-A5RCH6JLg9XHs5UF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-A5RCH6JLg9XHs5UF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-A5RCH6JLg9XHs5UF .marker.cross{stroke:#333333;}#mermaid-svg-A5RCH6JLg9XHs5UF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-A5RCH6JLg9XHs5UF p{margin:0;}#mermaid-svg-A5RCH6JLg9XHs5UF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-A5RCH6JLg9XHs5UF .cluster-label text{fill:#333;}#mermaid-svg-A5RCH6JLg9XHs5UF .cluster-label span{color:#333;}#mermaid-svg-A5RCH6JLg9XHs5UF .cluster-label span p{background-color:transparent;}#mermaid-svg-A5RCH6JLg9XHs5UF .label text,#mermaid-svg-A5RCH6JLg9XHs5UF span{fill:#333;color:#333;}#mermaid-svg-A5RCH6JLg9XHs5UF .node rect,#mermaid-svg-A5RCH6JLg9XHs5UF .node circle,#mermaid-svg-A5RCH6JLg9XHs5UF .node ellipse,#mermaid-svg-A5RCH6JLg9XHs5UF .node polygon,#mermaid-svg-A5RCH6JLg9XHs5UF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-A5RCH6JLg9XHs5UF .rough-node .label text,#mermaid-svg-A5RCH6JLg9XHs5UF .node .label text,#mermaid-svg-A5RCH6JLg9XHs5UF .image-shape .label,#mermaid-svg-A5RCH6JLg9XHs5UF .icon-shape .label{text-anchor:middle;}#mermaid-svg-A5RCH6JLg9XHs5UF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-A5RCH6JLg9XHs5UF .rough-node .label,#mermaid-svg-A5RCH6JLg9XHs5UF .node .label,#mermaid-svg-A5RCH6JLg9XHs5UF .image-shape .label,#mermaid-svg-A5RCH6JLg9XHs5UF .icon-shape .label{text-align:center;}#mermaid-svg-A5RCH6JLg9XHs5UF .node.clickable{cursor:pointer;}#mermaid-svg-A5RCH6JLg9XHs5UF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-A5RCH6JLg9XHs5UF .arrowheadPath{fill:#333333;}#mermaid-svg-A5RCH6JLg9XHs5UF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-A5RCH6JLg9XHs5UF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-A5RCH6JLg9XHs5UF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-A5RCH6JLg9XHs5UF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-A5RCH6JLg9XHs5UF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-A5RCH6JLg9XHs5UF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-A5RCH6JLg9XHs5UF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-A5RCH6JLg9XHs5UF .cluster text{fill:#333;}#mermaid-svg-A5RCH6JLg9XHs5UF .cluster span{color:#333;}#mermaid-svg-A5RCH6JLg9XHs5UF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-A5RCH6JLg9XHs5UF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-A5RCH6JLg9XHs5UF rect.text{fill:none;stroke-width:0;}#mermaid-svg-A5RCH6JLg9XHs5UF .icon-shape,#mermaid-svg-A5RCH6JLg9XHs5UF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-A5RCH6JLg9XHs5UF .icon-shape p,#mermaid-svg-A5RCH6JLg9XHs5UF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-A5RCH6JLg9XHs5UF .icon-shape .label rect,#mermaid-svg-A5RCH6JLg9XHs5UF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-A5RCH6JLg9XHs5UF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-A5RCH6JLg9XHs5UF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-A5RCH6JLg9XHs5UF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} CAS Server 中心节点
业务应用集群
票据校验
票据校验
票据校验
票据校验
应用 1
应用 2
应用 3
...应用 N
Web 层
Spring MVC + Webflow
票据子系统
TGT / ST
认证子系统
可插拔认证链
票据注册表
服务注册表
最关键的架构边界是:业务应用永远不碰密码。 密码只在中心服务端校验,攻击面从数百个应用收敛到一个节点。
服务端内部三层子系统
| 子系统 | 职责 |
|---|---|
| Web 层 | 基于 Spring MVC + Spring Webflow,登录、登出、MFA 确认、密码重置等所有用户流程都是状态机驱动,页面用 Thymeleaf 渲染 |
| 票据子系统 | SSO 核心逻辑。登录成功后签发 TGT 并写入加密 Cookie,访问业务系统时凭 TGT 换发一次性的 ST,业务系统再通过后端通道校验 ST 有效性 |
| 认证子系统 | 可插拔的认证处理器链,仅在建立会话和强制重认证时执行 |
支撑这三层的是两个可插拔注册表:
- 票据注册表:决定会话存储方式,生产环境可替换为 Redis、Hazelcast 等
- 服务注册表:定义接入应用的权限与策略
配置沿用 Spring Boot 风格,采用官方 WAR Overlay 模板构建,自定义代码与上游依赖物理隔离,升级仅需换版本号。
四、核心能力:不止是登录,是完整的身份平台
4.1 一个账号体系,兼容五种主流协议
这是 CAS 相比新一代纯 OIDC 身份产品最大的差异化:
| 协议 | 适用场景 |
|---|---|
| CAS 协议 1/2/3 | 遗留 Java 老应用 |
| SAML 1.1/2.0 | Confluence/JIRA 等商业软件 |
| OpenID Connect | 新写的移动 App / SPA |
| OAuth 2.0 | Spring Boot 微服务 |
| WS-Federation | 微软生态系统 |
意味着这些系统可以共享同一套用户目录、同一次 SSO 会话、同一套 MFA 策略和审计日志 。CAS 本质上是一个多协议翻译中枢,解决企业里"不同年代系统说不同语言"的最大痛点。
4.2 认证与 MFA 的完整军火库
#mermaid-svg-zxaUO1OZ6TuWN3JG{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zxaUO1OZ6TuWN3JG .error-icon{fill:#552222;}#mermaid-svg-zxaUO1OZ6TuWN3JG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zxaUO1OZ6TuWN3JG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zxaUO1OZ6TuWN3JG .marker.cross{stroke:#333333;}#mermaid-svg-zxaUO1OZ6TuWN3JG svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zxaUO1OZ6TuWN3JG p{margin:0;}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge{stroke-width:3;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section--1 rect,#mermaid-svg-zxaUO1OZ6TuWN3JG .section--1 path,#mermaid-svg-zxaUO1OZ6TuWN3JG .section--1 circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .section--1 polygon,#mermaid-svg-zxaUO1OZ6TuWN3JG .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .section--1 text{fill:#ffffff;}#mermaid-svg-zxaUO1OZ6TuWN3JG .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-depth--1{stroke-width:17;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:lightgray;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:#efefef;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-0 rect,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-0 path,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-0 circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-0 polygon,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-0 text{fill:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .node-icon-0{font-size:40px;color:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-depth-0{stroke-width:14;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:lightgray;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:#efefef;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-1 rect,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-1 path,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-1 circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-1 polygon,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-1 text{fill:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .node-icon-1{font-size:40px;color:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-depth-1{stroke-width:11;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:lightgray;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:#efefef;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-2 rect,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-2 path,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-2 circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-2 polygon,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-2 text{fill:#ffffff;}#mermaid-svg-zxaUO1OZ6TuWN3JG .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-depth-2{stroke-width:8;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:lightgray;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:#efefef;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-3 rect,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-3 path,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-3 circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-3 polygon,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-3 text{fill:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .node-icon-3{font-size:40px;color:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-depth-3{stroke-width:5;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:lightgray;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:#efefef;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-4 rect,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-4 path,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-4 circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-4 polygon,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-4 text{fill:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .node-icon-4{font-size:40px;color:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-depth-4{stroke-width:2;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:lightgray;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:#efefef;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-5 rect,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-5 path,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-5 circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-5 polygon,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-5 text{fill:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .node-icon-5{font-size:40px;color:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-depth-5{stroke-width:-1;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:lightgray;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:#efefef;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-6 rect,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-6 path,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-6 circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-6 polygon,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-6 text{fill:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .node-icon-6{font-size:40px;color:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-depth-6{stroke-width:-4;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:lightgray;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:#efefef;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-7 rect,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-7 path,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-7 circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-7 polygon,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-7 text{fill:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .node-icon-7{font-size:40px;color:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-depth-7{stroke-width:-7;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:lightgray;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:#efefef;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-8 rect,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-8 path,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-8 circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-8 polygon,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-8 text{fill:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .node-icon-8{font-size:40px;color:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-depth-8{stroke-width:-10;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:lightgray;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:#efefef;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-9 rect,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-9 path,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-9 circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-9 polygon,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-9 text{fill:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .node-icon-9{font-size:40px;color:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-depth-9{stroke-width:-13;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:lightgray;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:#efefef;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-10 rect,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-10 path,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-10 circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-10 polygon,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-10 text{fill:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .node-icon-10{font-size:40px;color:black;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge-depth-10{stroke-width:-16;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:lightgray;}#mermaid-svg-zxaUO1OZ6TuWN3JG .disabled text{fill:#efefef;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-root rect,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-root path,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-root circle,#mermaid-svg-zxaUO1OZ6TuWN3JG .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-root text{fill:#ffffff;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-root span{color:#ffffff;}#mermaid-svg-zxaUO1OZ6TuWN3JG .section-2 span{color:#ffffff;}#mermaid-svg-zxaUO1OZ6TuWN3JG .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-zxaUO1OZ6TuWN3JG .edge{fill:none;}#mermaid-svg-zxaUO1OZ6TuWN3JG .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-zxaUO1OZ6TuWN3JG :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} CAS 认证能力
认证方式
LDAP / AD
JDBC
Kerberos 域免密
X.509 证书
认证链组合
MFA 形态
TOTP 软令牌
FIDO2 / WebAuthn
YubiKey
推送认证
触发策略
服务粒度
用户属性
IP 段
风险评分
生命周期
密码自助重置
账号自注册
登录防爆破
会话管理
模拟登录
例如:访问财务系统强制 FIDO2,外网访问必须 MFA,内网办公仅需 TOTP------这种自适应 MFA 在商业 IAM 中是高级功能,在 CAS 里只是配置项。
4.3 服务治理与审计能力
服务注册表是 CAS 作为平台 而非登录接口的核心:
| 能力 | 说明 |
|---|---|
| 访问策略 | 可在中心侧做粗粒度权限控制,不满足条件的用户在登录页就被拦截 |
| 属性释放 | 可针对不同应用返回不同字段,最小化数据暴露 |
| 审计能力 | 覆盖全链路事件,可对接日志、SIEM,天然满足等保、金融等合规场景的追溯要求 |
4.4 委托认证:既能当 IdP,也能当身份代理
很多组织已有企业微信、钉钉、Azure AD、GitHub 等主身份源,不想再维护一套账号密码。CAS 支持委托认证:
#mermaid-svg-SJHUUOpCMxJ89IRL{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SJHUUOpCMxJ89IRL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SJHUUOpCMxJ89IRL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SJHUUOpCMxJ89IRL .error-icon{fill:#552222;}#mermaid-svg-SJHUUOpCMxJ89IRL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SJHUUOpCMxJ89IRL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SJHUUOpCMxJ89IRL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SJHUUOpCMxJ89IRL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SJHUUOpCMxJ89IRL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SJHUUOpCMxJ89IRL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SJHUUOpCMxJ89IRL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SJHUUOpCMxJ89IRL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SJHUUOpCMxJ89IRL .marker.cross{stroke:#333333;}#mermaid-svg-SJHUUOpCMxJ89IRL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SJHUUOpCMxJ89IRL p{margin:0;}#mermaid-svg-SJHUUOpCMxJ89IRL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-SJHUUOpCMxJ89IRL .cluster-label text{fill:#333;}#mermaid-svg-SJHUUOpCMxJ89IRL .cluster-label span{color:#333;}#mermaid-svg-SJHUUOpCMxJ89IRL .cluster-label span p{background-color:transparent;}#mermaid-svg-SJHUUOpCMxJ89IRL .label text,#mermaid-svg-SJHUUOpCMxJ89IRL span{fill:#333;color:#333;}#mermaid-svg-SJHUUOpCMxJ89IRL .node rect,#mermaid-svg-SJHUUOpCMxJ89IRL .node circle,#mermaid-svg-SJHUUOpCMxJ89IRL .node ellipse,#mermaid-svg-SJHUUOpCMxJ89IRL .node polygon,#mermaid-svg-SJHUUOpCMxJ89IRL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SJHUUOpCMxJ89IRL .rough-node .label text,#mermaid-svg-SJHUUOpCMxJ89IRL .node .label text,#mermaid-svg-SJHUUOpCMxJ89IRL .image-shape .label,#mermaid-svg-SJHUUOpCMxJ89IRL .icon-shape .label{text-anchor:middle;}#mermaid-svg-SJHUUOpCMxJ89IRL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-SJHUUOpCMxJ89IRL .rough-node .label,#mermaid-svg-SJHUUOpCMxJ89IRL .node .label,#mermaid-svg-SJHUUOpCMxJ89IRL .image-shape .label,#mermaid-svg-SJHUUOpCMxJ89IRL .icon-shape .label{text-align:center;}#mermaid-svg-SJHUUOpCMxJ89IRL .node.clickable{cursor:pointer;}#mermaid-svg-SJHUUOpCMxJ89IRL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-SJHUUOpCMxJ89IRL .arrowheadPath{fill:#333333;}#mermaid-svg-SJHUUOpCMxJ89IRL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SJHUUOpCMxJ89IRL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SJHUUOpCMxJ89IRL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SJHUUOpCMxJ89IRL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-SJHUUOpCMxJ89IRL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SJHUUOpCMxJ89IRL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-SJHUUOpCMxJ89IRL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SJHUUOpCMxJ89IRL .cluster text{fill:#333;}#mermaid-svg-SJHUUOpCMxJ89IRL .cluster span{color:#333;}#mermaid-svg-SJHUUOpCMxJ89IRL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-SJHUUOpCMxJ89IRL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-SJHUUOpCMxJ89IRL rect.text{fill:none;stroke-width:0;}#mermaid-svg-SJHUUOpCMxJ89IRL .icon-shape,#mermaid-svg-SJHUUOpCMxJ89IRL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SJHUUOpCMxJ89IRL .icon-shape p,#mermaid-svg-SJHUUOpCMxJ89IRL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-SJHUUOpCMxJ89IRL .icon-shape .label rect,#mermaid-svg-SJHUUOpCMxJ89IRL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SJHUUOpCMxJ89IRL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-SJHUUOpCMxJ89IRL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-SJHUUOpCMxJ89IRL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 选择外部 IdP
返回断言
建立本地 SSO 会话
用户
企业微信 / 钉钉 / Azure AD
CAS
向下游签发票据
业务系统
也就是说,CAS 既能当身份提供方 给业务系统发令牌,也能当服务提供方 接入上游 IdP,两头做协议翻译。非常适合扫码登录、跨组织身份联邦、多 IdP 统一入口等场景。
五、8.0 代际升级:不只是换个版本号
8.0 版本的几个变化直接影响运维与升级决策:
| 变化 | 说明 |
|---|---|
| 运行时提速 | JDK 25 基线带来 AOT 缓存优化,同等部署下启动时间从 7-9 秒压缩到约 5 秒,GraalVM 原生镜像支持持续打磨 |
| 配置强校验 | cas 命名空间的配置启动时强制校验,拼写错误或未知属性直接拒绝启动。牺牲了部分兼容性,但消灭了"配置写错静默失效"的隐蔽风险 |
| 工程质量升级 | 引入空值契约注解,构建工具升级到 Gradle 9.6,测试覆盖率约 94% |
| 架构简化 | 老式 Session 复制能力默认废弃,多节点 HA 统一走分布式票据注册表 |
| 协议增量 | OIDC 联邦成为独立模块,支持作为信任锚实现多 IdP 互信;管理控制台功能增强,无密码登录、SCIM 账号自动配给能力持续完善 |
六、Spring Boot 集成详解:三条路径接入
CAS 与 Spring Boot 生态深度绑定,无论是身份服务端的搭建,还是业务系统的接入,都有标准化的 Maven 工程范式。
6.1 服务端:Maven WAR Overlay 构建
#mermaid-svg-DqaaPTNoIKSSoB0o{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DqaaPTNoIKSSoB0o .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DqaaPTNoIKSSoB0o .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DqaaPTNoIKSSoB0o .error-icon{fill:#552222;}#mermaid-svg-DqaaPTNoIKSSoB0o .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DqaaPTNoIKSSoB0o .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DqaaPTNoIKSSoB0o .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DqaaPTNoIKSSoB0o .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DqaaPTNoIKSSoB0o .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DqaaPTNoIKSSoB0o .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DqaaPTNoIKSSoB0o .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DqaaPTNoIKSSoB0o .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DqaaPTNoIKSSoB0o .marker.cross{stroke:#333333;}#mermaid-svg-DqaaPTNoIKSSoB0o svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DqaaPTNoIKSSoB0o p{margin:0;}#mermaid-svg-DqaaPTNoIKSSoB0o .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DqaaPTNoIKSSoB0o .cluster-label text{fill:#333;}#mermaid-svg-DqaaPTNoIKSSoB0o .cluster-label span{color:#333;}#mermaid-svg-DqaaPTNoIKSSoB0o .cluster-label span p{background-color:transparent;}#mermaid-svg-DqaaPTNoIKSSoB0o .label text,#mermaid-svg-DqaaPTNoIKSSoB0o span{fill:#333;color:#333;}#mermaid-svg-DqaaPTNoIKSSoB0o .node rect,#mermaid-svg-DqaaPTNoIKSSoB0o .node circle,#mermaid-svg-DqaaPTNoIKSSoB0o .node ellipse,#mermaid-svg-DqaaPTNoIKSSoB0o .node polygon,#mermaid-svg-DqaaPTNoIKSSoB0o .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DqaaPTNoIKSSoB0o .rough-node .label text,#mermaid-svg-DqaaPTNoIKSSoB0o .node .label text,#mermaid-svg-DqaaPTNoIKSSoB0o .image-shape .label,#mermaid-svg-DqaaPTNoIKSSoB0o .icon-shape .label{text-anchor:middle;}#mermaid-svg-DqaaPTNoIKSSoB0o .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DqaaPTNoIKSSoB0o .rough-node .label,#mermaid-svg-DqaaPTNoIKSSoB0o .node .label,#mermaid-svg-DqaaPTNoIKSSoB0o .image-shape .label,#mermaid-svg-DqaaPTNoIKSSoB0o .icon-shape .label{text-align:center;}#mermaid-svg-DqaaPTNoIKSSoB0o .node.clickable{cursor:pointer;}#mermaid-svg-DqaaPTNoIKSSoB0o .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DqaaPTNoIKSSoB0o .arrowheadPath{fill:#333333;}#mermaid-svg-DqaaPTNoIKSSoB0o .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DqaaPTNoIKSSoB0o .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DqaaPTNoIKSSoB0o .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DqaaPTNoIKSSoB0o .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DqaaPTNoIKSSoB0o .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DqaaPTNoIKSSoB0o .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DqaaPTNoIKSSoB0o .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DqaaPTNoIKSSoB0o .cluster text{fill:#333;}#mermaid-svg-DqaaPTNoIKSSoB0o .cluster span{color:#333;}#mermaid-svg-DqaaPTNoIKSSoB0o div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DqaaPTNoIKSSoB0o .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DqaaPTNoIKSSoB0o rect.text{fill:none;stroke-width:0;}#mermaid-svg-DqaaPTNoIKSSoB0o .icon-shape,#mermaid-svg-DqaaPTNoIKSSoB0o .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DqaaPTNoIKSSoB0o .icon-shape p,#mermaid-svg-DqaaPTNoIKSSoB0o .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DqaaPTNoIKSSoB0o .icon-shape .label rect,#mermaid-svg-DqaaPTNoIKSSoB0o .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DqaaPTNoIKSSoB0o .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DqaaPTNoIKSSoB0o .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DqaaPTNoIKSSoB0o :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 官方基础 WAR 包
Maven WAR 插件
开发者工程
配置/页面/扩展类
自动合并覆盖
最终可部署 WAR
核心优势:自定义代码与上游官方代码物理隔离,升级版本时几乎不用修改业务逻辑,只调整依赖的版本号即可。
核心依赖结构:
| 依赖类型 | 说明 |
|---|---|
| 基础 WAR 包 | 官方 CAS 服务端基础功能 |
| 独立模块 | LDAP 认证源、Redis 分布式票据存储、OIDC 协议支持、JSON 文件服务注册、监控端点暴露、Thymeleaf 页面定制等 |
所有功能都以独立模块形式引入,不启用的模块不会加载,既不占用运行资源,也不会暴露多余端点。
核心配置项:
| 配置项 | 说明 |
|---|---|
| 访问域名与路径前缀 | 服务端的对外地址 |
| 票据存储方案 | 生产环境推荐切换为 Redis 分布式存储以支持多节点部署 |
| 服务注册来源 | 比如从 JSON 文件批量加载允许接入的业务应用 |
| 认证源对接 | 比如对接企业内部 LDAP 目录服务 |
前端与运维:
- 开发环境可一键生成自签名证书用于测试
- 生产环境必须替换为正式签发的证书
- 登录页、错误页、邮件模板等前端资源,只需要在工程对应目录下放同名的页面文件,就会自动覆盖官方默认样式
生产部署:
- 用 Spring Cloud Config 集中管理配置,实现动态刷新
- 用 Spring Boot Admin 做运行时监控
- CAS 原生暴露了完整的监控指标与健康检查端点,可直接接入企业现有监控体系
6.2 业务端:三种接入路径
#mermaid-svg-5SgRsZD3IEfe8mkX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5SgRsZD3IEfe8mkX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5SgRsZD3IEfe8mkX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5SgRsZD3IEfe8mkX .error-icon{fill:#552222;}#mermaid-svg-5SgRsZD3IEfe8mkX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5SgRsZD3IEfe8mkX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5SgRsZD3IEfe8mkX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5SgRsZD3IEfe8mkX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5SgRsZD3IEfe8mkX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5SgRsZD3IEfe8mkX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5SgRsZD3IEfe8mkX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5SgRsZD3IEfe8mkX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5SgRsZD3IEfe8mkX .marker.cross{stroke:#333333;}#mermaid-svg-5SgRsZD3IEfe8mkX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5SgRsZD3IEfe8mkX p{margin:0;}#mermaid-svg-5SgRsZD3IEfe8mkX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5SgRsZD3IEfe8mkX .cluster-label text{fill:#333;}#mermaid-svg-5SgRsZD3IEfe8mkX .cluster-label span{color:#333;}#mermaid-svg-5SgRsZD3IEfe8mkX .cluster-label span p{background-color:transparent;}#mermaid-svg-5SgRsZD3IEfe8mkX .label text,#mermaid-svg-5SgRsZD3IEfe8mkX span{fill:#333;color:#333;}#mermaid-svg-5SgRsZD3IEfe8mkX .node rect,#mermaid-svg-5SgRsZD3IEfe8mkX .node circle,#mermaid-svg-5SgRsZD3IEfe8mkX .node ellipse,#mermaid-svg-5SgRsZD3IEfe8mkX .node polygon,#mermaid-svg-5SgRsZD3IEfe8mkX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5SgRsZD3IEfe8mkX .rough-node .label text,#mermaid-svg-5SgRsZD3IEfe8mkX .node .label text,#mermaid-svg-5SgRsZD3IEfe8mkX .image-shape .label,#mermaid-svg-5SgRsZD3IEfe8mkX .icon-shape .label{text-anchor:middle;}#mermaid-svg-5SgRsZD3IEfe8mkX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5SgRsZD3IEfe8mkX .rough-node .label,#mermaid-svg-5SgRsZD3IEfe8mkX .node .label,#mermaid-svg-5SgRsZD3IEfe8mkX .image-shape .label,#mermaid-svg-5SgRsZD3IEfe8mkX .icon-shape .label{text-align:center;}#mermaid-svg-5SgRsZD3IEfe8mkX .node.clickable{cursor:pointer;}#mermaid-svg-5SgRsZD3IEfe8mkX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5SgRsZD3IEfe8mkX .arrowheadPath{fill:#333333;}#mermaid-svg-5SgRsZD3IEfe8mkX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5SgRsZD3IEfe8mkX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5SgRsZD3IEfe8mkX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5SgRsZD3IEfe8mkX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5SgRsZD3IEfe8mkX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5SgRsZD3IEfe8mkX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5SgRsZD3IEfe8mkX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5SgRsZD3IEfe8mkX .cluster text{fill:#333;}#mermaid-svg-5SgRsZD3IEfe8mkX .cluster span{color:#333;}#mermaid-svg-5SgRsZD3IEfe8mkX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5SgRsZD3IEfe8mkX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5SgRsZD3IEfe8mkX rect.text{fill:none;stroke-width:0;}#mermaid-svg-5SgRsZD3IEfe8mkX .icon-shape,#mermaid-svg-5SgRsZD3IEfe8mkX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5SgRsZD3IEfe8mkX .icon-shape p,#mermaid-svg-5SgRsZD3IEfe8mkX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5SgRsZD3IEfe8mkX .icon-shape .label rect,#mermaid-svg-5SgRsZD3IEfe8mkX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5SgRsZD3IEfe8mkX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5SgRsZD3IEfe8mkX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5SgRsZD3IEfe8mkX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 存量 Java 系统
已用 Spring Security
全新 Spring Boot 项目
业务系统接入 CAS
技术栈现状
路径一:原生 CAS 客户端
路径二:Spring Security CAS 模块
路径三:标准 OIDC 接入
路径一:原生 Java CAS 客户端 + Spring Boot 自动装配
存量 Java 系统改造成本最低的方式,不依赖 Spring Security 体系。
| 项目 | 说明 |
|---|---|
| 集成方式 | 引入官方 Spring Boot 版 CAS 客户端依赖即可完成自动装配 |
| 核心配置 | CAS 服务端访问前缀、登录页地址、当前业务系统访问地址、CAS3 协议校验模式 |
| 工作流程 | 客户端自动注册认证过滤器与票据校验过滤器;未登录请求 302 重定向到 CAS 登录页;登录完成后带回票据参数,过滤器在后端发起服务端到服务端的票据校验;校验通过后将用户身份信息与属性写入本地会话 |
| 适用场景 | 老系统快速接入、未使用 Spring Security 的传统 Spring Boot 应用 |
路径二:Spring Security CAS 模块
如果业务系统已经深度使用 Spring Security 的权限体系,可以用官方 Spring Security CAS 模块,将 CAS 认证接入现有过滤链,复用已有的授权逻辑。
事实澄清 :截至 Spring Security 7.1.1,官方的
spring-security-cas模块仍在正常发布,7.0.x、7.1.x 均有正式发行包。CAS 并没有从 Spring Security 7 中移除,网上的过时传言不足为信。
| 项目 | 说明 |
|---|---|
| 集成方式 | 引入 Spring Security 官方的 CAS 模块依赖 |
| 配置逻辑 | 声明回调地址与服务标识,配置票据校验端点地址,将 CAS 认证结果转换为 Spring Security 标准的身份对象,加入安全过滤链 |
| 适用场景 | 已建立完善 Spring Security 权限模型的存量应用,不需要重构授权体系,只替换认证源 |
路径三:标准 OIDC 接入(新项目首选)
对于全新的 Spring Boot 项目,最推荐的方式是把 CAS 当成一个普通的 OIDC 身份提供方,用 Spring Security 原生的 OAuth2 登录能力接入,业务代码中完全不出现 CAS 专有 API。
| 项目 | 说明 |
|---|---|
| 集成方式 | 引入 Spring Boot 官方 OAuth2 客户端启动器 |
| 服务端准备 | CAS 开启 OIDC 模块后提供标准协议发现端点;在服务注册表中将业务应用登记为 OIDC 客户端,分配客户端 ID、密钥,配置回调地址白名单 |
| 业务端配置 | 填写客户端凭证、权限范围,以及 CAS 服务端的 OIDC 发行地址 |
| 核心优势 | 完全遵循 OIDC 标准协议,业务系统与身份提供方彻底解耦。未来如果要把 CAS 换成 Keycloak、Azure AD 或其他 OIDC 平台,应用侧几乎零改动 |
七、协议选型原则
#mermaid-svg-nNtbBCYkaTOsSbNw{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-nNtbBCYkaTOsSbNw .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nNtbBCYkaTOsSbNw .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nNtbBCYkaTOsSbNw .error-icon{fill:#552222;}#mermaid-svg-nNtbBCYkaTOsSbNw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nNtbBCYkaTOsSbNw .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nNtbBCYkaTOsSbNw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nNtbBCYkaTOsSbNw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nNtbBCYkaTOsSbNw .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nNtbBCYkaTOsSbNw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nNtbBCYkaTOsSbNw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nNtbBCYkaTOsSbNw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nNtbBCYkaTOsSbNw .marker.cross{stroke:#333333;}#mermaid-svg-nNtbBCYkaTOsSbNw svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nNtbBCYkaTOsSbNw p{margin:0;}#mermaid-svg-nNtbBCYkaTOsSbNw .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-nNtbBCYkaTOsSbNw .cluster-label text{fill:#333;}#mermaid-svg-nNtbBCYkaTOsSbNw .cluster-label span{color:#333;}#mermaid-svg-nNtbBCYkaTOsSbNw .cluster-label span p{background-color:transparent;}#mermaid-svg-nNtbBCYkaTOsSbNw .label text,#mermaid-svg-nNtbBCYkaTOsSbNw span{fill:#333;color:#333;}#mermaid-svg-nNtbBCYkaTOsSbNw .node rect,#mermaid-svg-nNtbBCYkaTOsSbNw .node circle,#mermaid-svg-nNtbBCYkaTOsSbNw .node ellipse,#mermaid-svg-nNtbBCYkaTOsSbNw .node polygon,#mermaid-svg-nNtbBCYkaTOsSbNw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-nNtbBCYkaTOsSbNw .rough-node .label text,#mermaid-svg-nNtbBCYkaTOsSbNw .node .label text,#mermaid-svg-nNtbBCYkaTOsSbNw .image-shape .label,#mermaid-svg-nNtbBCYkaTOsSbNw .icon-shape .label{text-anchor:middle;}#mermaid-svg-nNtbBCYkaTOsSbNw .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-nNtbBCYkaTOsSbNw .rough-node .label,#mermaid-svg-nNtbBCYkaTOsSbNw .node .label,#mermaid-svg-nNtbBCYkaTOsSbNw .image-shape .label,#mermaid-svg-nNtbBCYkaTOsSbNw .icon-shape .label{text-align:center;}#mermaid-svg-nNtbBCYkaTOsSbNw .node.clickable{cursor:pointer;}#mermaid-svg-nNtbBCYkaTOsSbNw .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-nNtbBCYkaTOsSbNw .arrowheadPath{fill:#333333;}#mermaid-svg-nNtbBCYkaTOsSbNw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-nNtbBCYkaTOsSbNw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-nNtbBCYkaTOsSbNw .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nNtbBCYkaTOsSbNw .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-nNtbBCYkaTOsSbNw .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nNtbBCYkaTOsSbNw .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-nNtbBCYkaTOsSbNw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-nNtbBCYkaTOsSbNw .cluster text{fill:#333;}#mermaid-svg-nNtbBCYkaTOsSbNw .cluster span{color:#333;}#mermaid-svg-nNtbBCYkaTOsSbNw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-nNtbBCYkaTOsSbNw .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-nNtbBCYkaTOsSbNw rect.text{fill:none;stroke-width:0;}#mermaid-svg-nNtbBCYkaTOsSbNw .icon-shape,#mermaid-svg-nNtbBCYkaTOsSbNw .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nNtbBCYkaTOsSbNw .icon-shape p,#mermaid-svg-nNtbBCYkaTOsSbNw .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-nNtbBCYkaTOsSbNw .icon-shape .label rect,#mermaid-svg-nNtbBCYkaTOsSbNw .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nNtbBCYkaTOsSbNw .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-nNtbBCYkaTOsSbNw .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-nNtbBCYkaTOsSbNw :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 协议选型
新系统
存量 Java 系统
跨厂商商业软件
优先 OIDC
CAS 原生协议
SAML
| 系统类型 | 推荐协议 |
|---|---|
| 新系统 | 优先用 OIDC |
| 存量 Java 系统 | 用 CAS 原生协议 |
| Confluence、JIRA 等跨厂商商业软件 | 用 SAML |
八、总结
Apereo CAS 是一款被严重低估的身份中间件。它的价值不在于"新",而在于二十多年积累下来的完整能力矩阵:
| 核心优势 | 说明 |
|---|---|
| 多协议翻译中枢 | 同时支持 CAS、SAML、OIDC、OAuth2、WS-Federation |
| 攻击面收敛 | 业务应用永远不碰密码,密码只在中心服务端校验 |
| 认证与 MFA 完整 | LDAP/AD、Kerberos、X.509、TOTP、FIDO2、YubiKey 全覆盖 |
| 服务治理能力 | 服务注册表、属性释放、审计能力,天然满足合规要求 |
| 委托认证 | 既能当 IdP,也能当身份代理,支持多 IdP 统一入口 |
| 工程化成熟 | WAR Overlay 构建,自定义代码与上游隔离,升级成本低 |
对于正在做 JDK 25、Spring Boot 4.1 升级的团队,CAS 8.0.1 是一个值得认真评估的选择。它证明了一件事:活得久不等于过时,能把复杂问题沉淀成配置项的工具,才是真正的平台。