XACML全称为可扩展访问控制标记语言,是基于XML设计的一种标准化访问控制策略描述语言,由OASIS组织制定发布,主要用于解决分布式系统中访问控制策略的统一描述和管理问题。

XACML的核心组成
XACML的架构包含多个核心组件,各组件分工协作完成访问控制决策流程,具体组件及作用如下:
| 组件名称 | 核心作用 |
|---|---|
| 策略管理点(PAP) | 负责创建、管理和发布访问控制策略,是策略的源头 |
| 策略执行点(PEP) | 拦截用户的访问请求,将请求转换为XACML格式发送给策略决策点,再根据决策结果执行允许或拒绝操作 |
| 策略决策点(PDP) | 接收PEP发来的请求,结合存储的策略信息做出访问允许或拒绝的决策,将结果返回给PEP |
| 策略信息点(PIP) | 为PDP提供决策所需的额外属性信息,比如用户的角色、资源的属性、当前的环境条件等 |
| 策略存储点(PRP) | 持久化存储所有的访问控制策略,供PDP查询使用 |
XACML策略的基本结构
XACML的策略采用分层结构,从顶层到底层分别是策略集、策略、规则,每层都有明确的语法定义,以下是一个简单的策略示例,用于限制普通用户只能在工作日访问内部文档资源:
<?xml version="1.0" encoding="UTF-8"?>
<PolicySet xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"
PolicySetId="internal_doc_access_policy_set"
Version="1.0">
<!-- 策略集:包含针对内部文档的访问策略 -->
<Policy PolicyId="normal_user_doc_access_policy" Version="1.0">
<!-- 策略目标:匹配访问内部文档的请求 -->
<Target>
<AnyOf>
<AllOf>
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">internal_doc</AttributeValue>
<AttributeDesignator Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-type"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="true"/>
</Match>
</AllOf>
</AnyOf>
</Target>
<!-- 规则:普通用户仅工作日可访问 -->
<Rule RuleId="normal_user_weekday_access_rule" Effect="Permit">
<Target>
<AnyOf>
<AllOf>
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">normal_user</AttributeValue>
<AttributeDesignator Category="urn:oasis:names:tc:xacml:3.0:attribute-category:subject"
AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-role"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="true"/>
</Match>
</AllOf>
</AnyOf>
</Target>
<Condition>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:day-of-week-is-weekday">
<AttributeDesignator Category="urn:oasis:names:tc:xacml:3.0:attribute-category:environment"
AttributeId="urn:oasis:names:tc:xacml:1.0:environment:current-day-of-week"
DataType="http://www.w3.org/2001/XMLSchema#integer"
MustBePresent="true"/>
</Apply>
</Condition>
</Rule>
<!-- 默认拒绝其他情况 -->
<Rule RuleId="deny_other_access" Effect="Deny"/>
</Policy>
</PolicySet>
XACML的优势与应用场景
XACML相比传统硬编码的权限控制方式有明显优势:首先是标准化,不同系统只要遵循XACML标准就可以实现策略互通,不需要为每个系统单独开发权限模块;其次是细粒度控制,可以基于用户属性、资源属性、环境条件等多维度制定规则,比如可以限制某地区的管理员只能在办公网络访问敏感数据;最后是可维护性,权限规则统一存储在PRP中,修改策略不需要改动业务系统代码,只需要更新对应的XACML策略文件即可。
常见的应用场景包括企业级单点登录系统的权限管理、云平台的资源访问控制、金融系统的敏感数据访问管控等,当系统需要统一管理多个异构应用的访问权限时,XACML是非常合适的选择。
XACML的使用注意事项
- 策略设计时尽量避免过于复杂的嵌套规则,否则会影响PDP的决策效率,增加请求响应时间
- 需要定期审计存储的XACML策略,及时清理过期、冗余的策略,避免权限泄露
- PIP提供的属性信息需要保证准确性和实时性,否则会导致决策结果错误
- 如果系统对性能要求极高,可以结合缓存机制存储常用的决策结果,减少PDP的重复计算
如果需要实际落地XACML,可以选择开源的实现框架比如Apache Axiom、OpenAM,也可以根据标准规范自行开发适配业务需求的PDP和PEP组件。
XACML可扩展访问控制标记语言访问控制策略管理修改时间:2026-07-14 13:18:40