Xpath的转型在java中不工作(Xpath transformation not working

2019-06-24 15:54发布

这是我的XML文档。 我想签仅使用XML签名的用户ID的一部分。 我使用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


问题是什么?
编辑
正如@乔恩HORSTMANN透露上述消息只是一个日志或类似的东西。 现在的问题是,即使给予XPath查询后,整个文档进行签名,而不是仅仅的用户名。 我通过改变的值确认这<testing>签名文档后元件。 其结果是,该文件没有得到验证(如果只签署了用户名的一部分,然后再进行任何更改<testing>应该产生一个有效签名。)

Answer 1:

这不是一个有效的XPath表达式,没有办法申报的表达式中的命名空间prefixe。

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在这里 ,它的日志水平应可能比INFO低虽然。

我也有看,XPath过滤的描述 :

在输入节点集合的每个节点出现在XPath参数中的XPath表达式的计算一次。 将结果转换成布尔。 如果布尔为真,则该节点被包括在输出节点集合。 如果布尔为假,则该节点被从输出节点集合删去。

所以,正确的XPath表达式只包括UserID在签名会self::UserID 。 但是,不要问我,如果这实际上是一个XML签名是有道理的。 在本说明书的例子中,似乎使用XPath表达式包括除了所述签名元件本身的一切:

not(ancestor-or-self::dsig:Signature)

编辑2:

正确的表达实际上是ancestor-or-self::UserID ,因为过滤器还必须包括文本子节点UserID节点。



文章来源: Xpath transformation not working in java