如何将CSV或XML格式的角色权限数据转换为XACML格式?
角色权限映射转XACML实现方案
核心映射逻辑
首先梳理你现有数据到XACML标准模型的对应关系:
- 主体(Subject):将XML中的
<role>字段值映射为XACML主体的角色属性,属性ID默认使用标准urn:oasis:names:tc:xacml:1.0:subject:role - 资源(Resource):将
permission数组内的url字段映射为XACML资源ID,属性ID使用标准urn:oasis:names:tc:xacml:1.0:resource:resource-id,如果业务需要匹配label、subMenu字段可以自定义资源属性做扩展 - 动作(Action):此处为页面查询操作,动作ID可设为
view或GET,可根据你系统实际请求动作调整 - 决策结果:角色、资源、动作全部匹配时返回
Permit(允许访问)
转换后的XACML 3.0示例代码
<?xml version="1.0" encoding="UTF-8"?> <Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" PolicyId="siasn-profil-access-policy" RuleCombiningAlgId="urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides" Version="1.0"> <!-- 策略目标:匹配profile类查询请求 --> <Target> <AnyOf> <AllOf> <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">view</AttributeValue> <AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" DataType="http://www.w3.org/2001/XMLSchema#string" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action" MustBePresent="false"/> </Match> </AllOf> </AnyOf> </Target> <!-- viewprofil角色访问规则 --> <Rule RuleId="allow-viewprofil-role-access" 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">role:siasn-instansi:profilasn:viewprofil</AttributeValue> <AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:subject:role" DataType="http://www.w3.org/2001/XMLSchema#string" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:subject" MustBePresent="false"/> </Match> <!-- 匹配3个允许访问的URL --> <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-is-in"> <AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" DataType="http://www.w3.org/2001/XMLSchema#string" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" MustBePresent="false"/> <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">/tampilanData/pns</AttributeValue> <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">/tampilanData/pppk</AttributeValue> <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">/tampilanData/JPTNonASN</AttributeValue> </Match> </AllOf> </AnyOf> </Target> </Rule> <!-- 默认拒绝所有不匹配的请求 --> <Rule RuleId="default-deny" Effect="Deny"/> </Policy>
补充说明
- 如果你有多个角色权限映射,每个角色对应一组权限可以单独写一条Rule,也可以合并到同一个Policy下统一管理
- 业务不需要用到的
label、subMenu字段可以不用加入XACML的目标匹配逻辑,减少策略计算开销 - 如果需要更细粒度的控制,可以添加Condition节点实现参数级的校验逻辑
内容的提问来源于stack exchange,提问作者Rafif Favian
相关产品推荐
相关产品推荐

