- 后端
- 认证鉴权
- 单点登录
【免费下载链接】cas
Apereo CAS - Identity & Single Sign On for all earthlings and beyond.
CAS(Apereo CAS)借助 Spring Boot Admin 将自身注册为 Admin Client,通过 HTTP 协议向 Spring Boot Admin Server 上报运行状态与健康信息,从而在 Web 界面中可视化地管理和监控 CAS 内部状态。本文围绕 CAS 官方监控文档,结合当前仓库中cas-server-support-bootadmin模块的源码与 Puppeteer 集成测试,完整讲解在 WAR Overlay 中引入该扩展、配置 Admin Server/Client、加固端点安全以及在集群环境下落地部署的实战方案。读完本文,你将掌握如何让单个 CAS 节点同时充当 Spring Boot Admin 的服务端与客户端,并能在多节点集群中实现"一主多从"的集中监控拓扑。
Spring Boot Admin 在 CAS 中的整体定位
Spring Boot Admin 是一个面向 Spring Boot 应用的社区监控方案,由独立的 Admin Server 与注册其中的各个 Admin Client 组成。CAS 将这一能力内化为官方扩展模块,并承担双重角色:
- Spring Boot Admin Server:CAS 通过专用扩展模块内置了 Admin Server Web 应用,部署后管理控制台暴露在
/sba上下文路径下; - Spring Boot Admin Client:每个 CAS 节点在配置就绪后自动向 Admin Server 注册自身,并通过 HTTP 持续上报状态与健康数据,呈现在控制台界面中。
这种设计让运维人员不需要额外搭建独立的监控中间件,直接在 CAS 进程内获得一套可视化监控入口。在 CasFeatureModule.java 中,SpringBootAdmin被登记为独立的特性开关(Feature),对应自动配置类受@ConditionalOnFeatureEnabled(feature = CasFeatureModule.FeatureCatalog.SpringBootAdmin)约束(见 CasSpringBootAdminAutoConfiguration.java),意味着该模块可通过 CAS 特性开关机制统一启用或关闭。
添加扩展依赖
支持 Spring Boot Admin 的功能位于cas-server-support-bootadmin模块。要在 CAS 中启用该能力,需要在 WAR Overlay 中引入如下依赖:
implementation "org.apereo.cas:cas-server-support-bootadmin"从模块构建脚本 build.gradle 可以看到,该模块聚合了 Spring Boot Admin 的 Server 与 Client 两个核心库(springbootadminserver、springbootadminclient),同时依赖cas-server-core-web-api、cas-server-core-logging-api、cas-server-core-util-api以及 Spring Security Web/Config、Thymeleaf、Hibernate Validator 等支撑组件,这说明该扩展与 CAS 的 Web 安全体系深度绑定,并非简单透传第三方库。
::: warning 安全警告 Admin Server 的 API 端点必须进行安全加固。如果使用凭据进行端点认证,强烈建议同时让 Admin Server 与注册上来的 CAS 节点都运行在 HTTPS 之下,避免凭据与健康数据在传输过程中暴露。 :::
配置 Spring Boot Admin Server
引入依赖并部署后,Spring Boot Admin 控制台即出现在/sba上下文路径(Context Path)下。服务端的行为由spring.boot.admin.server.*属性族控制,例如:
# 服务端上下文路径,控制台默认位于 /sba spring.boot.admin.context-path=/sba # 显式启用/停用服务端能力 spring.boot.admin.server.enabled=true服务端的启动逻辑由 CasSpringBootAdminServerInitializer.java 承载:该类实现ApplicationEntrypointInitializer,通过@EnableAdminServer注解的静态内部类CasSpringBootAdminServer作为应用入口源之一,随 CAS 主程序一起启动 Admin Server。CasSpringBootAdminServerInitializerTests(CasSpringBootAdminServerInitializerTests.java)验证了初始化器能够被 CAS 的应用入口发现机制正确加载,且getApplicationSources返回的配置源非空。
自动配置类 CasSpringBootAdminAutoConfiguration.java 中,服务端还装配了三个关键 Bean:
springBootAdminWebClientCustomizer:使用 CAS 自己的HttpClient的 TrustManager 构建 Netty SSL 上下文,并启用压缩,使 Admin Server 访问各 CAS 节点的 actuator 端点时可以复用 CAS 的 TLS 信任体系;springBootAdminEndpointConfigurer:为/sba路径定制 Spring Security 规则,/sba/assets/**与/sba/login放行,/sba/**其余路径要求认证,并配置表单登录页与登出 URL;springBootAdminInstanceIdGenerator:注入定制的实例 ID 生成器(详见下文"实例 ID 的确定性生成")。
配置 Spring Boot Admin Client
每个 CAS 节点都可以作为 Admin Client 自动注册到 Admin Server。前提是提供足够配置,让 CAS 知道 Admin Server 的位置与连接方式。相关属性统一以spring.boot.admin.client.*为前缀:
# Admin Server 地址,CAS 将向该地址注册自己 spring.boot.admin.client.url=https://localhost:8443/cas # 注册与状态上报时使用的凭据 spring.boot.admin.client.username=casuser spring.boot.admin.client.password=Mellon # 客户端实例的 management 基础地址(集群多端口场景下指定) spring.boot.admin.client.instance.management-base-url=https://localhost:8444/cas在 CasSpringBootAdminAutoConfiguration.java 的SpringBootAdminClientConfiguration中,CAS 基于自身HttpClient构建RestClientRegistrationClient作为RegistrationClient;当配置了用户名与密码时,会为请求注入BasicAuthenticationInterceptor,实现向 Admin Server 注册/注销时的基本认证。测试类 CasSpringBootAdminServerTests.java 中以spring.boot.admin.client.url=https://localhost:8443/cas、username=casuser、password=Mellon的配置组合验证了注册与注销流程。
值得注意的是,CAS 的 actuator 端点默认是受保护的。要让 CAS 与 Admin Server 之间能够安全通信,需要按 Spring Boot Admin 的规范开放并配置 actuator 端点的访问控制(具体配置见下文"安全"一节),确保 Admin Server 能够以合法凭据拉取健康与状态数据。
安全:访问控制与凭据
访问 Spring Boot Admin Server 默认需要表单登录认证,所用凭据来自 Spring Security 配置,即spring.security.user.*属性族:
spring.security.user.name=casadmin spring.security.user.password=ChangeMe除了上述基础登录之外,官方文档还强调了以下几点:
- 服务端访问客户端端点:Admin Server 会访问各 CAS 节点的 actuator 端点来解析并展示数据。由于 CAS 的 actuator 端点默认要求认证,Admin Server 默认复用与保护 actuator 端点相同的凭据;
- 客户端上报服务端:作为 Admin Client 的 CAS 节点会向 Admin Server 自动注册并上报状态,这类请求与 API 调用默认采用与上述相同的安全机制与凭据(对应源码中
BasicAuthenticationInterceptor的注入逻辑); - 双角色可按需裁剪:单个 CAS 部署既可以同时充当 Server 与 Client,也可以单独只开服务端或只开客户端。例如在集群部署中,主节点可同时承担 Admin Server 与 Client 角色,其余从节点只作为主节点的 Client。
此外,从 spring-boot-admin-server/script.json 的场景配置可以看到 CAS 官方测试对端点安全的标准做法——将 actuator 端点暴露并授权给 Admin Server 读取:
# 开放 actuator 端点并全部暴露 management.endpoints.web.exposure.include=* management.endpoints.access.default=UNRESTRICTED # CAS 自身的端点访问级别 cas.monitor.endpoints.endpoint.defaults.access=AUTHENTICATED集群部署:一主多从的监控拓扑
官方在 Puppeteer 场景 spring-boot-admin-server-cluster 中给出了一套两节点集群的完整参考配置,可用于验证"主节点兼作 Server/Client、从节点仅作 Client"的典型拓扑:
主节点(instance1):开启服务端能力,并设置自身的节点名称:
--cas.host.name=CASInstance1 --spring.boot.admin.server.enabled=true从节点(instance2):关闭服务端、禁用服务发现,仅作为 Client 指向主节点的/sba地址,并通过management-base-url指明本节点的 management 地址:
--cas.host.name=CASInstance2 --spring.boot.admin.client.url=https://localhost:8443/cas${spring.boot.admin.context-path} --spring.boot.admin.client.instance.management-base-url=https://localhost:8444/cas --spring.boot.admin.discovery.enabled=false --spring.boot.admin.server.enabled=false两节点共享的安全与端点配置:
--spring.security.user.name=s#kiooritea --spring.security.user.password=p@$$W0rd --cas.monitor.endpoints.endpoint.defaults.access=AUTHENTICATED --management.endpoints.web.exposure.include=* --management.endpoints.access.default=UNRESTRICTED该场景的浏览器脚本 script.js 会以表单登录访问https://localhost:8443/cas/sba,再进入https://localhost:8443/cas/sba/applications/CAS页面,断言页面中div#CAS下的实例数量恰好为 2,从而验证两个节点都成功注册到了同一个 Admin Server 上。
实例 ID 的确定性生成
在多节点集群中,Admin Server 需要为每个注册实例生成稳定、唯一的实例 ID。CAS 并未直接采用 Spring Boot Admin 的默认生成策略,而是提供了自定义实现 CasServerInstanceIdGenerator.java:
- 实例名取自注册元数据中的
name字段,缺省时回退到 CAS 配置项cas.host.name(对应 CasServerHostProperties.java 中的name属性,即运行 CAS 的网络主机名); - 以「健康检查 URL + 实例名」拼接字符串,经 SHA-256 摘要后截取前 12 个字符作为实例 ID;
- 因此同一节点的重复注册会得到完全一致的 ID,避免 Admin Server 把重启后的同一节点误判为不同实例。
测试方法verifyInstanceIdGeneration(CasSpringBootAdminServerTests.java)构造了两个注册对象:一个带有name=CASInstance元数据、一个不带,验证两者生成 ID 的一致性,直接佐证了该确定性逻辑。
端到端行为验证
CasSpringBootAdminServerTests.java 是理解整个模块行为的最佳入口,它同时加载了 Admin Server 与 Client 的自动配置,并通过 MockWebServer 模拟 Admin Server 完成了一次完整的注册-注销往返:
val application = Application.create("CAS") .healthUrl("https://localhost:8443/cas/actuator/health") .managementUrl("https://localhost:8443/cas/actuator") .serviceUrl("https://localhost:8443/cas") .build(); // 注册返回服务端生成的实例 ID assertEquals("cas-instance", registrationClient.register(adminUrl, application)); // 注销不抛异常 assertDoesNotThrow(() -> registrationClient.deregister(adminUrl, "cas-instance"));可见 CAS 作为 Client 注册时携带的healthUrl、managementUrl、serviceUrl均指向自身 CAS 上下文下的 actuator 路径,这也解释了为何必须开放并保护 actuator 端点:它们是 Admin Server 拉取状态数据的唯一通道。
故障排查
当出现注册失败、状态不同步或界面加载异常时,可以修改日志配置文件,加入以下 Logger 以获得更详细的诊断信息:
<Logger name="de.codecentric.boot" level="debug" /> <Logger name="org.springframework.web.reactive" level="debug" />其中de.codecentric.boot覆盖 Spring Boot Admin Server 与 Client 的注册、心跳与实例管理逻辑;org.springframework.web.reactive则用于追踪 Admin Server 通过 WebClient 访问各节点 actuator 端点时的请求细节,对定位 TLS 握手失败、凭据不匹配等问题尤为有效。
小结
通过cas-server-support-bootadmin模块,CAS 将 Spring Boot Admin 的服务端与客户端能力完整内聚到自身进程中:控制台固定暴露于/sba,客户端凭spring.boot.admin.client.*自动注册上报,安全访问由spring.security.user.*与 actuator 端点授权共同保障。集群场景下,可借助cas.host.name与spring.boot.admin.server.enabled等开关实现"主节点兼作服务端、从节点仅作客户端"的灵活拓扑;自定义实例 ID 生成器则保证了节点重启后身份稳定。本文涉及的完整源码与测试场景,可继续在 cas-server-support-bootadmin 模块 及 spring-boot-admin-server-cluster 场景 中深入研读。
- 后端
- 认证鉴权
- 单点登录
【免费下载链接】cas
Apereo CAS - Identity & Single Sign On for all earthlings and beyond.
相关推荐
Spring Boot 集成 Admin 客户端监控:spring-boot-demo-admin-client 实战指南
Spring Boot 集成 Admin 客户端监控:spring boot demo admin client 实战指南 本文以 spring boot de
示例工程后端btop++ 快速上手:CPU、内存、进程一屏看全的系统资源监控
btop++ 快速上手:CPU、内存、进程一屏看全的系统资源监控 btop++ 是一个用 C++ 写的终端资源监控工具,Linux、macOS 和 BSD 都支
CLI指标监控运维Spring Boot Admin深度集成:可视化监控Spring Boot应用运行状态
Spring Boot Admin深度集成:可视化监控Spring Boot应用运行状态 Spring Boot Admin是一个强大的开源监控工具,专门用于管
示例工程后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考