SunXACML2.0代码创建请求PDP评估返回NotApplicable问题咨询
我之前在做权限系统开发时刚好踩过SunXACML 2.0的这个坑,给你拆解下问题根源和可行的解决思路:
问题原因
直接通过new Request(...)创建请求对象时,很容易忽略SunXACML内部要求的属性规范细节——比如属性标识符的URI格式、数据类型匹配、必要属性类别的完整性,甚至是一些默认元数据的缺失。而从文件加载请求时,XACML解析器会自动处理这些规范,确保请求结构完全符合XACML标准,所以能正常匹配策略返回Permit/Deny。
具体解决步骤
1. 严格对齐属性的标识符与数据类型
策略里定义的每个属性(比如主体、资源、动作)都有明确的URI标识符和数据类型,直接创建属性时必须完全匹配:
// 正确示例:创建符合规范的主体属性 Attribute subjectAttr = new Attribute( new AttributeIdentifier("urn:oasis:names:tc:xacml:1.0:subject:subject-id", null, null), null, "http://www.w3.org/2001/XMLSchema#string", new StringAttributeValue("user123") );
如果你的策略里用了自定义属性ID,一定要确保字符串完全一致(包括大小写和URI格式),PDP对这些细节是严格匹配的。
2. 用RequestFactory替代直接new Request
SunXACML提供了RequestFactory工厂类来创建请求,它会自动做格式验证和必要的元数据补全,比直接实例化更可靠:
Set<Attribute> subjects = new HashSet<>(); // 添加主体属性到subjects集合... Set<Attribute> resources = new HashSet<>(); // 添加资源属性到resources集合... Set<Attribute> actions = new HashSet<>(); // 添加动作属性到actions集合... Set<Attribute> environment = new HashSet<>(); // 即使没有环境属性也要传空集合,别传null Request request = RequestFactory.getInstance().createRequest(subjects, resources, actions, environment);
我之前直接new Request时传了null作为environment参数,结果PDP直接判定为NotApplicable,换成空集合就正常了。
3. 对比调试两种请求的结构
把从文件加载的Request和你自己创建的Request打印出来(或者用Debug查看内部属性),重点对比:
- 每个Attribute的
identifier、dataType、value是否一致 - 是否存在策略依赖的
issuer字段(如果策略里指定了issuer,你的属性必须设置对应的issuer) - Request是否包含所有必要的属性类别(subject/resource/action/environment)
4. 确保属性值的类型匹配
比如策略里用的是整数类型的属性,你不能传字符串值(哪怕内容是数字)。SunXACML不会自动类型转换,类型不匹配会导致属性无法匹配策略,返回NotApplicable。
结论
不是必须对请求进行编码,只是直接创建Request时要严格遵循XACML的规范细节,用工厂类创建、对齐属性定义、避免null参数,基本就能解决NotApplicable的问题。
内容的提问来源于stack exchange,提问作者student

