使用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)
答案 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