Xpath转换在java中不起作用
-
12-12-2019 - |
题
这是我的xml文档。我想使用xml签名仅签署userID部分。我正在使用xpath变换来选择该特定元素。
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
Version="2.0" IssueInstant="2012-05-22T13:40:52:390" ProtocolBinding="urn:oasis:na
mes:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsumerServiceURL="localhos
t:8080/consumer.jsp">
<UserID>
xyz
</UserID>
<testing>
text
</testing>
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
http://localhost:8080/saml/SProvider.jsp
</saml:Issuer>
</samlp:AuthnRequest>
我正在使用以下代码添加转换 :
transformList.add(exc14nTransform);
transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec("samlp:AuthnRequest/UserID xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\"")));
但我得到以下 :
Original Exception was javax.xml.transform.TransformerException: Extra illegal t
okens: 'xmlns', ':', 'samlp', '=', '"urn:oasis:names:tc:SAML:2.0:protocol"'
所以,我尝试删除xmlns部分。
transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec("samlp:AuthnRequest/UserID")));
但它签署了整个文档,并给出了以下消息 :
com.sun.org.apache.xml.internal.security.utils.CachedXPa
thFuncHereAPI fixupFunctionTable
INFO: Registering Here function
哪裡有問題?
编辑
正如@Jörn Horstmann所说,消息只是一个日志或类似的东西。现在的问题是,即使在给出xpath查询后,整个文档也会被签名,而不仅仅是UserID。我通过改变值来证实这一点 <testing>
对文档进行签名后的元素。结果是文档没有得到验证(如果它只签署了UserID部分,那么对 <testing>
应导致有效的签名。)
解决方案
这不是一个有效的xpath表达式,没有办法在表达式内部声明命名空间前缀。
samlp:AuthnRequest/UserID xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
XPathFilterParameterSpec 确实有另一个构造函数允许指定命名空间前缀的映射,您可以尝试以下表达式:
new XPathFilterParameterSpec("samlp:AuthnRequest/UserID",
Collections.singletonMap("samlp", "urn:oasis:names:tc:SAML:2.0:protocol"))
编辑:
该消息似乎没有错误,请参阅 这里是426号线, ,它的日志级别可能应该低于信息。
我也看了一下 xpath过滤的描述:
Xpath参数中出现的XPath表达式将针对输入节点集中的每个节点计算一次。结果转换为布尔值。如果布尔值为true,则该节点包含在输出节点集中。如果布尔值为false,则该节点将从输出节点集中省略。
所以正确的xpath表达式只包含 UserID
在签名将是 self::UserID
.但是不要问我,这对于xml签名是否真的有意义。规范中的示例似乎使用xpath表达式来包含除签名元素本身之外的所有内容:
not(ancestor-or-self::dsig:Signature)
编辑2:
正确的表达方式实际上是 ancestor-or-self::UserID
由于过滤器还必须包括 UserID
节点。
不隶属于 StackOverflow