后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载本篇技术指南聚焦 Apereo CAS 中 SAML2 元数据的 Git 托管方案覆盖 Service ProviderSP元数据的解析与拉取、Identity ProviderIdP元数据与密钥的存储推送、后台定时调度以及 Actuator 端点运维。读完本文读者将能够独立完成cas-server-support-saml-idp-metadata-git模块的配置并理解 CAS 底层如何通过 Git 仓库消除集群节点间元数据文件的手工同步。背景与适用场景当 CAS 以 SAML2 IdP 身份与多个 SP 对接时每个 SP 的元数据文档XML 格式和签名证书.pem格式需要在所有 CAS 节点上保持一致。传统做法是将元数据文件手工复制到每个节点这在集群规模扩大、SP 数量增多时极易出错。Git 托管方案的核心思想是将元数据文档作为 Git 仓库中的文件进行管理。CAS 启动或按需时从仓库拉取需要更新时提交并推送从而天然获得版本历史、变更审计和多节点一致性。启用模块在 CAS 部署overlay中引入以下模块dependency groupIdorg.apereo.cas/groupId artifactIdcas-server-support-saml-idp-metadata-git/artifactId version${cas.version}/version /dependency从源码结构看该模块的自动配置入口为 CasSamlIdPGitAutoConfiguration它通过Import同时引入 SP 元数据解析和 IdP 元数据管理两个子配置类分别由独立的 Feature 开关控制SAMLServiceProviderMetadatagit→ SP 元数据解析SAMLIdentityProviderMetadatagit→ IdP 元数据管理SP 元数据配置注册服务定义SAML 注册服务必须将metadataLocation字段设为git://以此向 CAS 声明该 SP 的元数据应从 Git 仓库获取。示例如下{ class : org.apereo.cas.support.saml.services.SamlRegisteredService, serviceId : the-entity-id-of-the-sp, name : SAMLService, id : 1, description : A Git-based metadata resolver, metadataLocation : git:// }metadataLocation是路由关键字。从源码中 GitSamlRegisteredServiceMetadataResolver.supports() 可以看到CAS 判断规则为val metadataLocation service.getMetadataLocation(); return metadataLocation ! null (metadataLocation.trim().startsWith(getSourceId()) || (metadataLocation.trim().startsWith(http) metadataLocation.trim().endsWith(.git)));即git://前缀或以http开头且以.git结尾的 URL 均可触发 Git 解析器。getSourceId()返回固定值git://。Git 仓库目录约定根据源码 getMetadataDirectory()SP 元数据文件固定存放在仓库根目录下的sp-metadata子目录中repository-root/ sp-metadata/ 1-SAMLService.xml ← 元数据文档 1-SAMLService.pem ← 签名证书可选文件命名规则为{serviceId}-{serviceName}.xml签名证书为同名.pem文件。从parseFileIntoSamlMetadataDocument()方法第 198–221 行可以看到CAS 解析文件时以第一个-分隔符提取serviceIdLong 类型和name字符串若找不到分隔符则使用System.nanoTime()作为临时 id。Git 连接配置Git 连接参数继承自 BaseGitProperties前缀为cas.authn.saml-idp.metadata.git。主要配置项如下属性默认值说明cas.authn.saml-idp.metadata.git.repository-url—Git 仓库地址必填激活整个 Git 元数据解析cas.authn.saml-idp.metadata.git.active-branchmaster工作分支cas.authn.saml-idp.metadata.git.username—认证用户名cas.authn.saml-idp.metadata.git.password—认证密码或 Tokencas.authn.saml-idp.metadata.git.ssh-session-password—SSH 会话密码cas.authn.saml-idp.metadata.git.private-key-passphrase—SSH 私钥口令cas.authn.saml-idp.metadata.git.strict-host-key-checkingtrue是否严格校验主机密钥cas.authn.saml-idp.metadata.git.timeoutPT10S操作超时ISO-8601 时长cas.authn.saml-idp.metadata.git.push-changesfalse是否允许推送变更cas.authn.saml-idp.metadata.git.sign-commitsfalse是否对提交进行 GPG 签名cas.authn.saml-idp.metadata.git.rebasefalse拉取时使用 rebase 策略cas.authn.saml-idp.metadata.git.clone-directory临时目录cas-saml-metadata本地克隆路径其中clone-directory在 GitSamlMetadataProperties 构造函数 中默认设为系统临时目录下的cas-saml-metadata生产环境建议显式指定一个持久化路径避免临时目录清理导致重复克隆。元数据解析调用链当 CAS 需要解析某个 SP 的元数据时调用链如下元数据解析计划SamlRegisteredServiceMetadataResolutionPlanConfigurer遍历已注册的解析器GitSamlRegisteredServiceMetadataResolver.supports()判断metadataLocation是否匹配匹配后调用load()方法先执行gitRepository.pull()从远端拉取最新变更然后在sp-metadata目录下列出所有.xml文件逐一解析为SamlMetadataDocument对象通过CriteriaSet中的 entityID 条件过滤出目标 SP 的元数据构建MetadataResolver返回。拉取失败时仅记录 WARN 日志Metadata files may be stale不会中断 SAML 认证流程但 CAS 将使用本地最后一次成功拉取的元数据文件。后台定时拉取Schedule默认情况下SP 元数据仅在需要解析时按需拉取。若希望 CAS 在后台周期性同步 Git 仓库可启用调度器。配置前缀为cas.authn.saml-idp.metadata.git.schedule属性默认值说明cas.authn.saml-idp.metadata.git.schedule.enabledfalse是否启用后台调度cas.authn.saml-idp.metadata.git.schedule.start-delayPT60S首次执行前的延迟cas.authn.saml-idp.metadata.git.schedule.repeat-intervalPT2H重复执行间隔cas.authn.saml-idp.metadata.git.schedule.cron-expression空自定义 Cron 表达式设置后覆盖 intervalcas.authn.saml-idp.metadata.git.schedule.cron-time-zone空Cron 时区从源码 GitSamlRegisteredServiceRepositoryScheduler 可以看到调度器使用 SpringScheduled注解同时支持cron和fixedDelay两种模式。执行逻辑非常简单读取origin远端名称缺省为default然后调用gitRepository.pull()。Scheduled( cron ${cas.authn.saml-idp.metadata.git.schedule.cron-expression:}, zone ${cas.authn.saml-idp.metadata.git.schedule.cron-time-zone:}, initialDelayString ${cas.authn.saml-idp.metadata.git.schedule.start-delay:PT60S}, fixedDelayString ${cas.authn.saml-idp.metadata.git.schedule.repeat-interval:PT2H})调度器 Bean 仅在schedule.enabledtrue时创建否则返回一个无操作代理不消耗线程资源。IdP 元数据管理CAS 作为 SAML2 IdP 自身也需对外暴露元数据文档、签名密钥和加密密钥。Git 托管方案将这些工件同样纳入版本控制。配置开关IdP 元数据 Git 管理需要额外开启idp-metadata-enabledcas.authn.saml-idp.metadata.git.idp-metadata-enabledtrue从 SamlIdPGitIdPMetadataConfiguration 可以看到该开关与repository-url同时满足时才会激活 IdP 元数据的 Git 相关 Bean。仓库中的文件布局GitSamlIdPMetadataLocator 继承自FileSystemSamlIdPMetadataLocator在仓库目录中按以下文件名查找工件文件用途idp-metadata.xmlIdP 元数据文档idp-signing.key签名私钥idp-signing.crt签名证书idp-encryption.key加密私钥idp-encryption.crt加密证书fetchInternal()方法第 37–67 行每次被调用时先执行gitRepository.pull()然后逐一读取上述文件组装为SamlIdPMetadataDocument对象。元数据加密与签名IdP 元数据工件支持额外的加密/签名层配置前缀为cas.authn.saml-idp.metadata.git.crypto对应 EncryptionJwtSigningJwtCryptographyProperties。从配置类可以看到加密和签名均使用 JWT 密码学属性模型分别支持配置密钥大小加密密钥crypto.encryption.key-size默认DEFAULT_STRINGABLE_ENCRYPTION_KEY_SIZE签名密钥crypto.signing.key-size默认DEFAULT_STRINGABLE_SIGNING_KEY_SIZE若crypto.enabled未显式开启SamlIdPGitIdPMetadataConfiguration 第 62–63 行 会输出 INFO 日志提示生产环境建议启用加密签名并退化为CipherExecutor.noOp()。生成器GitSamlIdPMetadataGenerator负责将 CAS 生成的 IdP 元数据含签名密钥对写入 Git 仓库。它由SamlIdPMetadataGeneratorConfigurationContext提供上下文信息实体 ID、各端点 URL 等由 Git 仓库实例负责 commit 和 push。Per-Service 元数据覆盖全局 IdP 元数据可被特定服务覆盖。实现机制是在元数据文档中设置appliesTo字段CAS 以此字段构建仓库内的子目录路径。从 GitSamlIdPMetadataLocator.getMetadataArtifactFile() 可以看到查找逻辑val directory getMetadataDirectory(registeredService); // 基于 appliesTo 构建子目录 val file new File(directory, fileName); if (file.exists() file.canRead() file.length() 0) { return file; } return new File(defaultMetadataDirectory, fileName); // 回退到全局目录即优先从{appliesTo}子目录中查找工件若该目录下文件不存在或为空则回退到仓库根目录下的全局文件。这允许为特定 SP 使用独立的证书和元数据而不影响其他 SP。元数据的写入与删除GitSamlRegisteredServiceMetadataResolver同时实现了SamlRegisteredServiceMetadataManager接口提供完整的 CRUD 能力操作方法行为保存store(document)写入{id}-{name}.xml和.pem→commitAll→push按名称删除removeByName(name)删除匹配文件 →commitAll→push按 ID 删除removeById(id)先findById再委托removeByName清空全部removeAll()FileUtils.cleanDirectory→commitAll→push所有写操作均在本地 Git 仓库中完成 commit 后执行 push提交信息格式为Committed {name}/Removed {name}/Removed all metadata documents。Actuator 端点CAS 通过 Actuator 端点samlIdPRegisteredServiceMetadata暴露已注册的 SAML SP 元数据信息便于运维人员在不登录管理控制台的情况下检查当前各 SP 元数据的加载状态。测试参考模块自带的测试基类 BaseGitSamlMetadataTests 为GitSamlIdPMetadataGeneratorTests、GitSamlIdPMetadataLocatorTests和GitSamlRegisteredServiceMetadataResolverTests提供共享的 Git 仓库测试环境可用于理解各组件在隔离条件下的行为边界。配置清单速查# --- Git 连接 --- cas.authn.saml-idp.metadata.git.repository-urlhttps://git.example.com/cas/saml-metadata.git cas.authn.saml-idp.metadata.git.active-branchmain cas.authn.saml-idp.metadata.git.usernamecas-service cas.authn.saml-idp.metadata.git.password${SAML_GIT_TOKEN} cas.authn.saml-idp.metadata.git.clone-directory/var/cas/saml-metadata cas.authn.saml-idp.metadata.git.timeoutPT10S # --- IdP 元数据 --- cas.authn.saml-idp.metadata.git.idp-metadata-enabledtrue cas.authn.saml-idp.metadata.git.crypto.enabledtrue cas.authn.saml-idp.metadata.git.crypto.encryption.key-size256 cas.authn.saml-idp.metadata.git.crypto.signing.key-size256 # --- 后台调度 --- cas.authn.saml-idp.metadata.git.schedule.enabledtrue cas.authn.saml-idp.metadata.git.schedule.start-delayPT60S cas.authn.saml-idp.metadata.git.schedule.repeat-intervalPT2H以上配置项的完整定义参见 GitSamlMetadataProperties 及其父类 BaseGitProperties。赞分享后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载相关推荐Apereo CAS 基于 Amazon S3 的 SAML2 动态元数据管理SP 元数据解析与 IdP 元数据托管实战Apereo CAS 基于 Amazon S3 的 SAML2 动态元数据管理SP 元数据解析与 IdP 元数据托管实战 Apereo CAS 作为 SAML后端认证鉴权单点登录CAS SAML2 元数据管理之 DynamoDb将 IdP 与 SP 元数据持久化到 Amazon DynamoDbCAS SAML2 元数据管理之 DynamoDb将 IdP 与 SP 元数据持久化到 Amazon DynamoDb 本篇指南聚焦 Apereo CAS 中后端认证鉴权单点登录Apereo CAS 中使用 Google Cloud Storage 托管 SAML2 IdP 元数据JSON 文档结构、GCS 对象布局与每服务覆盖机制Apereo CAS 中使用 Google Cloud Storage 托管 SAML2 IdP 元数据JSON 文档结构、GCS 对象布局与每服务覆盖机制后端认证鉴权单点登录上一篇如何测试与调试你的Build-A-Quiz-App常见问题与解决方案下一篇E1S性能优化如何配置自动刷新和日志管理提升响应速度创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
微网低碳经济调度:改进粒子群算法与碳捕集多时间尺度优化 做微网低碳经济调度这个方向有一段时间了,最初接触这个题目是因为一个含碳捕集元件的微网研究项目,核心诉求就一句话:在保证供电可靠性的前提下,把碳排放和运行成本一起压下来。这个问题的难点其实不在“优化”本身,而… · 2026/9/25 3:03:46
vinext 并发请求隔离架构解析:基于 AsyncLocalStorage 的两层作用域模型 后端Web框架SSR 【免费下载链接】vinext Vite plugin that reimplements the Next.js API surface — deploy anywhere 项目地址: https://gitcode.com/gh_mirrors/vi/vinext 点击查看 免费下载 导读
本文深入讲解 vinext(一个可部署到任意平台的 Vite… · 2026/9/25 3:03:46
Inoproshop指令库与库文件详解:从安装调用到封装避坑 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:25:25
SpringBoot学生考勤管理系统源码实战:环境搭建、数据库导入与二次开发 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:25:25
higgsfield项目深度解析:从强化学习原理到PyTorch实战 很多人第一眼看到“higgsfield”这个词,脑子里蹦出来的可能是物理课上那个给粒子赋予质量的希格斯场。我第一次在开源社区刷到这个项目名,也愣了一下,以为是某个理论物理方向的代码库。点进去才发现,这其实是一个聚焦强化学习和自… · 2026/9/25 4:25:19
汽车IMU原理与实战:从六轴感知到智能驾驶定位基石 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:25:13
ISO/SAE 21434网络安全合规落地:从风险评估到供应链治理 简介:本资源为ISO/SAE DIS 21434:2020(E)《道路车辆—网络安全工程》国际标准草案官方英文原版PDF文档,面向汽车电子工程师、信息安全研究人员、整车及零部件企业合规与功能安全团队,以及参与智能网联汽车认证与开发的技术人员。该草案构建了… · 2026/9/25 4:25:13
Elsevier期刊排版全指南:Neurocomputing投稿格式与LaTeX模板实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:25:07
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37