SpringSecurity-SAML(OpenSAML):无法解组断言:获取org.w3c.dom.DOMException:WRONG_DOCUMENT_ERR

时间:2015-06-25 21:09:54

标签: spring-saml opensaml

使用spring-security-saml处理来自IDP的断言,在服务器启动1到2小时后得到以下错误。问题始终无法重现。通过查看stacktrace,问题似乎与spring saml配置中使用的解析器池有关。请分享任何想法。

库版本: opensaml 2.6.1 spring-security-saml2 1.0.0.RELEASE

解析器池配置:

<bean id="parserPool" class="org.opensaml.xml.parse.StaticBasicParserPool" init-method="initialize">
    <property name="builderFeatures">
        <map>
            <entry key="http://apache.org/xml/features/dom/defer-node-expansion" value="false"/>
        </map>
    </property>
</bean>
<bean id="parserPoolHolder" class="org.springframework.security.saml.parser.ParserPoolHolder"/>

org.w3c.dom.DOMException:WRONG_DOCUMENT_ERR:节点用于与创建节点的文档不同的文档中。         at org.apache.xerces.dom.ParentNode.internalInsertBefore(Unknown Source)         at org.apache.xerces.dom.ParentNode.insertBefore(Unknown Source)         在org.apache.xerces.dom.NodeImpl.appendChild(未知来源)         在org.opensaml.xml.encryption.Decrypter.parseInputStream(Decrypter.java:821)         在org.opensaml.xml.encryption.Decrypter.decryptDataToDOM(Decrypter.java:599)         at org.opensaml.xml.encryption.Decrypter.decryptUsingResolvedEncryptedKey(Decrypter.java:784)         在org.opensaml.xml.encryption.Decrypter.decryptDataToDOM(Decrypter.java:524)         在org.opensaml.xml.encryption.Decrypter.decryptDataToList(Decrypter.java:442)         在org.opensaml.xml.encryption.Decrypter.decryptData(Decrypter.java:403)         在org.opensaml.saml2.encryption.Decrypter.decryptData(Decrypter.java:141)         在org.opensaml.saml2.encryption.Decrypter.decrypt(Decrypter.java:69)         在org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.processAuthenticationResponse(WebSSOProfileConsumerImpl.java:199)         在org.springframework.security.saml.SAMLAuthenticationProvider.authenticate(SAMLAuthenticationProvider.java:82)

2 个答案:

答案 0 :(得分:2)

根本原因:项目中多个xerces实现。

发现了这个问题。我的项目还有用于word文档处理的docx4j,docx4j在初始化时将系统属性javax.xml.parsers.DocumentBuilderFactory更改为“com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl”,如果系统属性为尚未设置和java版本&lt; 8,内部导致返回与opensaml不同的DocumentBuilderFactory实现初始化为。即org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

修复是使用以下java运行时选项将系统属性javax.xml.parsers.DocumentBuilderFactory设置为com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

-Djavax.xml.parsers.DocumentBuilderFactory = com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

答案 1 :(得分:0)

正如@Srini所说,根本原因是项目中有多个xerces实现。

我通过覆盖docx4j.properties中的docx4j属性解决了这个问题:

javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl