SpringSecurity-SAML(OpenSAML):无法解组断言:获取 org.w3c.dom.DOMException:WRONG_DOCUMENT_ERR
Posted
技术标签:
【中文标题】SpringSecurity-SAML(OpenSAML):无法解组断言:获取 org.w3c.dom.DOMException:WRONG_DOCUMENT_ERR【英文标题】:SpringSecurity-SAML(OpenSAML): Failed to unmarshall assertion: getting org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR 【发布时间】:2015-09-12 16:18:58 【问题描述】:使用 spring-security-saml 处理来自 IDP 的断言,在服务器启动 1 到 2 小时后低于错误。问题并非一直都可重现。通过查看堆栈跟踪,问题似乎与 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: A node is used in a different document than the one that created it.
at org.apache.xerces.dom.ParentNode.internalInsertBefore(Unknown Source)
at org.apache.xerces.dom.ParentNode.insertBefore(Unknown Source)
at org.apache.xerces.dom.NodeImpl.appendChild(Unknown Source)
at org.opensaml.xml.encryption.Decrypter.parseInputStream(Decrypter.java:821)
at org.opensaml.xml.encryption.Decrypter.decryptDataToDOM(Decrypter.java:599)
at org.opensaml.xml.encryption.Decrypter.decryptUsingResolvedEncryptedKey(Decrypter.java:784)
at org.opensaml.xml.encryption.Decrypter.decryptDataToDOM(Decrypter.java:524)
at org.opensaml.xml.encryption.Decrypter.decryptDataToList(Decrypter.java:442)
at org.opensaml.xml.encryption.Decrypter.decryptData(Decrypter.java:403)
at org.opensaml.saml2.encryption.Decrypter.decryptData(Decrypter.java:141)
at org.opensaml.saml2.encryption.Decrypter.decrypt(Decrypter.java:69)
at org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.processAuthenticationResponse(WebSSOProfileConsumerImpl.java:199)
at org.springframework.security.saml.SAMLAuthenticationProvider.authenticate(SAMLAuthenticationProvider.java:82)
【问题讨论】:
检查下面的链接是否有帮助***.com/questions/30341590/… 发现问题。我的项目也有用于 word 文档处理的 docx4j,docx4j 在初始化时更改了系统属性 javax.xml.parsers.DocumentBuilderFactory,这在内部导致返回一个 DocumentBuilderFactory 实现,该实现与初始化 opensaml 时使用的不同。 【参考方案1】:根本原因:项目中 xerces 的多个实现。
发现问题。我的项目也有 docx4j 用于 word 文档处理,docx4j 在初始化时将系统属性 javax.xml.parsers.DocumentBuilderFactory 更改为“com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl”,如果系统属性为尚未设置并且 java 版本
修复正在使用以下 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
【讨论】:
【参考方案2】:正如@Srini 所说,根本原因是项目中 xerces 的多个实现。
我通过覆盖 docx4j.properties
中的 docx4j 属性解决了这个问题:
javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
【讨论】:
以上是关于SpringSecurity-SAML(OpenSAML):无法解组断言:获取 org.w3c.dom.DOMException:WRONG_DOCUMENT_ERR的主要内容,如果未能解决你的问题,请参考以下文章
SFC Opens Sandbox to Crypto Exchanges
Android Studio (Windows) 中的 Flutter 错误:无法识别的选项:--add-opens
Alibaba opens a robot restaurant in Shanghai!
Java 9 中的 --add-exports 和 --add-opens 有啥区别?
Tesla opens technology innovation center in Beijing
Tomcat NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED