XACML是一种基于XML的细粒度访问控制策略语言,结构为Policy→Rule→Condition→Target,需与PDP/PEP协同工作,强调属性命名规范、Target高效过滤、Condition避免外部调用,并推荐使用Balana等工具验证。

XACML(eXtensible Access Control Markup Language)是一种基于XML的标准策略语言,用于定义细粒度的访问控制规则,核心目标是把“谁在什么条件下能对什么资源执行什么操作”用可交换、可执行的方式表达出来。
XACML策略的基本组成结构
一个XACML策略由多个嵌套层级构成:Policy(策略)→ Rule(规则)→ Condition(条件)→ Target(目标)。每个层级都有明确职责:
- Policy 是最高单位,包含一组Rule,还定义了策略ID、版本、适用范围(如是否允许覆盖)和决策合并算法(如“拒绝优先”或“允许优先”)
- Rule 表达一条具体授权逻辑,含Rule ID、Effect(Permit/Deny)、Target(快速匹配适用场景)和可选Condition(运行时动态判断)
- Target 用Subject、Resource、Action、Environment四类属性的匹配条件实现粗筛,不触发策略引擎评估开销
- Condition 是XPath或函数表达式,在Target匹配后进一步计算,支持属性比较、集合运算、时间判断等
用XML写一条典型XACML规则
以下是一个简单但完整的Rule示例:允许部门为“研发部”的用户读取标记为“内部”的文档
实际使用中的关键注意事项
XACML不是写完就能直接运行,需配合策略决策点(PDP)和策略执行点(PEP)协同工作。常见落地要点包括:
- 属性命名要统一且带命名空间,避免不同系统间语义歧义(例如用
urn:company:attr:department而非简单department) - Target尽量覆盖高频过滤条件,减少进入Condition计算的请求数;复杂逻辑优先放Condition而非嵌套多层Target
- 避免在Condition中调用外部服务(如查数据库),否则影响PDP响应性能;如必须,应封装为自定义函数并缓存结果
- 策略可组合:用PolicySet聚合多个Policy,用PolicyCombiningAlg指定冲突时的裁决方式(如DenyOverrides最常用)
工具与验证建议
手写XACML易出错,推荐借助成熟工具提升效率:
- 用WSO2 Balana或Axiomatics XACML Engine做本地策略加载与测试
- 用OASIS官方XSD校验XML语法合法性
- 通过模拟请求(JSON或XML格式的Context Document)验证策略行为,重点关注Deny/Permit/Indeterminate/NotApplicable四种返回值是否符合预期










