资讯动态

Apereo CAS 属性释放策略(Attribute Release Policy)详解:Return Allowed 白名单精准放行

发布时间:2026/9/27 8:07:54 来源:尧图企业网站定制
后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载本指南以 Apereo CAS 开源仓库中的 Attribute-Release-Policy-ReturnAllowed.md 为主体系统讲解ReturnAllowedAttributeReleasePolicy仅返回服务定义显式允许的属性的配置方法、底层实现原理以及它与属性定义存储Attribute Definition Store、内联 Groovy 脚本的配合用法。读完本文你将能够为 CAS 中的注册服务Registered Service精确配置属性白名单并理解 CAS 在属性释放阶段按名单过滤、按需动态解析的完整机制。一、策略概述只释放服务定义中显式允许的属性CAS 的属性释放策略Attribute Release Policy决定了认证成功之后哪些 principal 属性会被放入最终的 CAS 响应并交付给目标应用。CAS 内置了多种策略Deny All、Return All、Return Mapped、Return Static 等完整列表见 Attribute-Release-Policies.md而Return Allowed是其中最常用、最贴近最小权限原则的策略之一。它的核心语义只有一句话仅返回由服务定义service definition显式允许allowed的 principal 属性。也就是说allowedAttributes列表就是一份白名单凡是未出现在该列表中的属性无论 principal 上是否已解析出对应值都不会被释放给该应用。在 CAS 源码中该策略对应 ReturnAllowedAttributeReleasePolicy.java它继承自AbstractRegisteredServiceAttributeReleasePolicy是 CAS 属性释放策略体系中的基础实现之一自 CAS 4.1.0 起引入。二、服务定义中的配置方式JSON 示例在注册服务Registered Service的 JSON 定义中通过attributeReleasePolicy字段挂载该策略并使用allowedAttributes声明允许释放的属性名列表。以下是文档给出的完整默认配置示例{ class : org.apereo.cas.services.CasRegisteredService, serviceId : ^https://app.example.org, name : sample, id : 100, attributeReleasePolicy : { class : org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy, allowedAttributes : [ java.util.ArrayList, [ cn, mail, sn ] ] } }配置要点说明class策略级别必须固定为org.apereo.cas.services.ReturnAllowedAttributeReleasePolicyCAS 的 JSON 反序列化依赖该类型标识来实例化正确的策略对象。allowedAttributes[ java.util.ArrayList, [ ... ] ]是 CAS Jackson 序列化约定下的列表写法第一个元素声明集合类型第二个元素为实际属性名列表。上例表示该服务仅被允许接收cn、mail、sn三个属性。serviceId、name、id分别是服务匹配正则、服务名称与服务唯一标识是CasRegisteredService的基础字段。大小写不敏感的匹配从源码实现看策略在比对白名单时会构造一个TreeMapString, ListObject并使用String.CASE_INSENSITIVE_ORDER排序器见 ReturnAllowedAttributeReleasePolicy.java因此属性名的匹配是大小写不敏感的。测试用例verifyRequestedDefinitionsWithExistingPrincipalAttribute也印证了这一点当允许列表配置为custom-name、principal 解析出customName属性时最终释放结果中仍能以custom-Name键取到值见 ReturnAllowedAttributeReleasePolicyTests.java。三、底层原理策略在属性释放链路中的位置要真正理解 Return Allowed需要把它放回 CAS 属性释放的完整链路中看。AbstractRegisteredServiceAttributeReleasePolicy#getAttributes是策略执行的统一入口其执行顺序大致如下见 AbstractRegisteredServiceAttributeReleasePolicy.java通过 principal 属性仓库principalAttributesRepository解析 principal 的原始属性集合若应用上下文中存在属性定义存储Attribute Definition Store则基于策略请求的属性定义对原始属性做进一步解析与装饰如重命名、scoped、加密等调用策略自身的getAttributesInternalReturn Allowed 即authorizeReleaseOfAllowedAttributes执行白名单过滤依据excludeDefaultAttributes决定是否合并全局默认释放属性default-attributes-to-release按需插入principalIdAttribute指定的 principal 标识属性依次调用后置处理器post-processors、属性过滤器attributeFilter最后返回最终集合。其中 Return Allowed 的核心过滤逻辑在authorizeReleaseOfAllowedAttributes中遍历allowedAttributes列表若当前属性已解析出来则直接放入待释放集合若未解析出来则进入动态按需解析分支详见下文第四、五节。相关实现见 ReturnAllowedAttributeReleasePolicy.java。四、与属性定义存储配合动态按需解析属性原文档特别强调被该策略授权允许释放的属性不一定已经作为已解析的 principal 属性存在它们可以被动态地按需解析resolved on the fly dynamically——这依靠的是 Attribute-Definitions.md 中介绍的属性定义存储Attribute Definition Store。属性定义存储用于描述属性的元数据如虚拟重命名、scoped 限定、加密、脚本生成等配置在cas.authn.attribute-repository.attribute-definition-store指定的 JSON 文件中。例如定义一个由empl_identifier源属性生成的 scoped 属性employeeId{ class : java.util.TreeMap, employeeId : { class : org.apereo.cas.authentication.attribute.DefaultAttributeDefinition, key : employeeId, scoped : true, attribute : empl_identifier } }随后即可像普通属性一样通过 Return Allowed 策略释放它... attributeReleasePolicy: { class : org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy, allowedAttributes : [ java.util.ArrayList, [ employeeId ] ] } ...这条机制得以生效的源码依据有两点determineRequestedAttributeDefinitions会把allowedAttributes中除内联脚本以外的条目全部上报为请求的属性定义见 ReturnAllowedAttributeReleasePolicy.java基类在resolveAttributesFromAttributeDefinitionStore中调用AttributeDefinitionStore解析这些请求的定义将原本不存在的属性生产出来见 AbstractRegisteredServiceAttributeReleasePolicy.java。测试类AttributeDefinitionsTests中的verifyUnresolvedAttributes用例正是验证了这一场景principal 上只有cn属性但策略允许释放displayName最终仍能通过属性定义解析出该属性见 ReturnAllowedAttributeReleasePolicyTests.java。与之配套的测试资源位于support/cas-server-support-person-directory/src/test/resources/return-allowed-definitions.json。五、使用内联 Groovy 动态构建属性allowedAttributes列表中的条目还可以是内联 Groovy 脚本由脚本在运行时动态构建属性并返回一个MapString, ListObject。文档给出的示例如下{ class : org.apereo.cas.services.CasRegisteredService, serviceId : ^https://app.example.org, name : Sample, id : 1, attributeReleasePolicy : { class : org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy, allowedAttributes : [ java.util.ArrayList, [ cn, groovy { [ fullName: [ FN/ attributes[fullName][0] ] ] }, sn ] ] } }脚本写法说明以groovy { ... }包裹的内联片段会被ExecutableCompiledScriptFactory识别为内联脚本源码中通过isInlineScript(key)判断见 ReturnAllowedAttributeReleasePolicy.java脚本体内可用的绑定变量binding包括context策略上下文RegisteredServiceAttributeReleasePolicyContext、attributes已解析的原始属性集合和loggerSLF4J Logger返回值必须是MapString, ListObject上例中脚本读取attributes[fullName][0]并拼接出fullName属性值将其加入待释放集合。测试用例verifyInlineGroovy验证了该行为允许列表同时包含uid与内联 Groovy 脚本后释放结果中同时包含uid与脚本生成的fullName见 ReturnAllowedAttributeReleasePolicyTests.java。两点补充限制均来自源码实现内联脚本仅在非 Native Image运行环境下生效CasRuntimeHintsRegistrar.notInNativeImage()判断见 ReturnAllowedAttributeReleasePolicy.java使用内联 Groovy 前需要先让 CAS 集成并支持 Apache Groovy 脚本引擎具体步骤请参考 Apache-Groovy-Scripting.md。六、策略共享设置项继承自基类作为AbstractRegisteredServiceAttributeReleasePolicy的子类Return Allowed 同样支持所有释放策略共用的设置项。下表汇总了这些字段及其作用参见 Attribute-Release-Policies.md 与 AbstractRegisteredServiceAttributeReleasePolicy.java设置项类型/取值作用authorizedToReleaseCredentialPassword布尔是否允许该服务接收以属性形式释放的用户凭据ClearPass涉及敏感信息默认关闭authorizedToReleaseProxyGrantingTicket布尔是否允许该服务接收以属性形式释放的代理授权票据 ID默认关闭excludeDefaultAttributes布尔是否排除全局默认属性包default-attributes-to-release即不向该服务释放全局默认属性authorizedToReleaseAuthenticationAttributes布尔是否释放认证事件元数据属性如认证发生时间等默认trueprincipalIdAttribute字符串自定义属性名CAS 会将已认证的 principal 标识id作为该属性的值放入最终属性集合canonicalizationModeUPPER/LOWER/NONE对最终释放的所有属性值统一做大小写变换order整数策略在链式释放Chaining中的执行顺序activationCriteria对象策略激活条件满足条件才执行本策略attributeFilter对象基于属性值的过滤器进一步裁剪最终属性principalAttributesRepository对象指定用于取属性值的属性仓库详见 Attribute-Release-Caching.mdconsentPolicy对象属性释放的同意consent策略以canonicalizationMode为例基类在returnFinalAttributesCollection中会按模式对每个属性值执行UPPER/LOWER变换见 AbstractRegisteredServiceAttributeReleasePolicy.java。测试用例verifyValueCaseTransformation验证了uid[cas1, cas2]在UPPER模式下会输出[CAS1, CAS2]见 ReturnAllowedAttributeReleasePolicyTests.java。再如excludeDefaultAttributes基类会读取cas.authn.attribute-repository.core.default-attributes-to-release配置的全局默认属性并合并进释放集合而开启该选项后这些默认属性会被跳过见 AbstractRegisteredServiceAttributeReleasePolicy.java。测试verifyDefaultAttributes同时验证了默认属性合并与principalIdAttribute注入两个行为见 ReturnAllowedAttributeReleasePolicyTests.java。七、安全注意事项与实践建议在 CAS 文档的释放策略总览中有一则明确的安全警告同样适用于 Return Allowed见 Attribute-Release-Policies.md使用前务必三思。盲目授权应用接收代理授权票据或用户凭据可能造成安全泄露与攻击面扩大。务必确认确实需要这些能力并理解背后的原理尽量避免启用——尤其是共享用户凭据这类敏感数据。结合本文内容给出如下实践建议遵循最小权限原则allowedAttributes只放目标应用真正需要的属性白名单之外的属性一律不释放优先采用静态白名单 属性定义存储的组合需要虚拟重命名、scoped、格式化等装饰时把装饰逻辑收敛到属性定义存储中保持服务定义简洁谨慎使用内联 Groovy脚本具备完全动态的构建能力务必校验脚本来源与内容并提前配置好 Apache Groovy 支持见 Apache-Groovy-Scripting.md多策略场景使用链式释放当单一白名单无法满足需求时可将多个策略通过ChainingAttributeReleasePolicy串联执行详见 Attribute-Release-Policies-Chain.md。八、参考资料索引本文主体文档Attribute-Release-Policy-ReturnAllowed.md策略总览与共享设置项Attribute-Release-Policies.md属性定义存储Attribute-Definitions.md策略核心实现ReturnAllowedAttributeReleasePolicy.java抽象基类实现AbstractRegisteredServiceAttributeReleasePolicy.java单元测试ReturnAllowedAttributeReleasePolicyTests.javaGroovy 脚本引擎集成Apache-Groovy-Scripting.md赞分享后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载相关推荐CAS 属性释放策略详解ReturnStatic 静态属性释放Attribute Release Policy - Return StaticCAS 属性释放策略详解ReturnStatic 静态属性释放Attribute Release Policy Return Static 本指南围绕 A后端认证鉴权单点登录Apereo CAS 属性发布策略Attribute Release Policies完全指南Apereo CAS 属性发布策略Attribute Release Policies完全指南 属性发布策略Attribute Release Polic后端认证鉴权单点登录Apereo CAS 属性释放同意Attribute Release Consent的 JDBC/JPA 存储配置实战Apereo CAS 属性释放同意Attribute Release Consent的 JDBC/JPA 存储配置实战 导读 本文聚焦 Apereo CAS后端认证鉴权单点登录上一篇使用 lein 测试 Clojure MXNet 包从项目克隆到集成验证的完整指南下一篇graphql-js 执行引擎全解析深入 graphql/execution 模块的 Execute 与 Subscribe 实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑