Java Weblogic 12c上的Spring SAML

Java Weblogic 12c上的Spring SAML,java,spring-security,weblogic,opensaml,spring-saml,Java,Spring Security,Weblogic,Opensaml,Spring Saml,我目前正在开发一个应用程序,该应用程序使用springsaml()项目作为身份验证的一部分。我知道它仍然在RC中,但我们正在开发的应用程序也是如此。在部署到Tomcat7时,我们已经集成了该库,并且功能齐全,但在部署到Weblogic 12c(12.0.1.2)时遇到了问题。在Weblogic上,在不引发任何错误的情况下,断言值将被还原为空无错误 问题似乎出在Xerces库中。据我所知,Spring SAML(由于OpenSAML)需要2.10.0版本,但Weblogic提供了Xerces库的2

我目前正在开发一个应用程序,该应用程序使用springsaml()项目作为身份验证的一部分。我知道它仍然在RC中,但我们正在开发的应用程序也是如此。在部署到Tomcat7时,我们已经集成了该库,并且功能齐全,但在部署到Weblogic 12c(12.0.1.2)时遇到了问题。在Weblogic上,在不引发任何错误的情况下,断言值将被还原为空无错误

问题似乎出在Xerces库中。据我所知,Spring SAML(由于OpenSAML)需要2.10.0版本,但Weblogic提供了Xerces库的2.8.0版本。我试图通过在Project WEB-INF/lib文件夹中包含正确的xercesImpl和xml API JAR来更新Xerces库版本。这修复了SpringSAML的decrpyting问题,但破坏了Weblogics解析JSP页面的能力。我在下面为未升级和升级的Xerces异常提供了部分堆栈跟踪。如果有人知道如何正确地解决这个问题,使Spring SAML能够在不破坏默认功能的情况下实现Weblogic的功能,我将不胜感激

这是更新Xerces之前的堆栈跟踪

2014-07-31 10:43:37,675 [[ACTIVE] ExecuteThread: '2' for queue:     'weblogic.kernel.Default (self-tuning)'] DEBUG org.apache.xml.security.algorithms.JCEMapper   - Request for U
RI http://www.w3.org/2001/04/xmlenc#aes256-cbc
2014-07-31 10:43:37,675 [[ACTIVE] ExecuteThread: '2' for queue:    'weblogic.kernel.Default (self-tuning)'] DEBUG org.apache.xml.security.encryption.XMLCipher    - JCE Algorithm
 = AES/CBC/ISO10126Padding
<Jul 31, 2014 10:43:37 AM EDT> <Error> <HTTP> <BEA-101020>     <[ServletContext@1538876008[app:intranet module:intranet.war path:null spec-version:3.0]]    Servlet failed with an
Exception
java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:504)
    at java.lang.Integer.valueOf(Integer.java:582)
    at org.opensaml.common.SAMLVersion.valueOf(SAMLVersion.java:89)
    at org.opensaml.saml2.core.impl.AssertionUnmarshaller.processAttribute(AssertionUnmarshaller.java:71)
    at org.opensaml.xml.io.AbstractXMLObjectUnmarshaller.unmarshallAttribute(AbstractXMLObjectUnmarshaller.java:254)
    at org.opensaml.xml.io.AbstractXMLObjectUnmarshaller.unmarshall(AbstractXMLObjectUnmarshaller.java:113)
    at org.opensaml.xml.encryption.Decrypter.decryptDataToList(Decrypter.java:479)
    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:190)
    at org.springframework.security.saml.SAMLAuthenticationProvider.authenticate(SAMLAuthenticationProvider.java:82)
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156)
    at org.springframework.security.saml.SAMLProcessingFilter.attemptAuthentication(SAMLProcessingFilter.java:84)
2014-07-31 10:43:37675[[ACTIVE]ExecuteThread:'2'队列:'weblogic.kernel.Default(self-tuning)'DEBUG org.apache.xml.security.algorithms.JCEMapper-请求
RIhttp://www.w3.org/2001/04/xmlenc#aes256-cbc
2014-07-31 10:43:37675[[ACTIVE]ExecuteThread:'2'用于队列:'weblogic.kernel.Default(自调优)']DEBUG org.apache.xml.security.encryption.xmlchipher-JCE算法
=AES/CBC/ISO1016

对于war文件,您是否使用过
首选web inf类
,对于ear文件,您是否使用过
首选应用程序包
?其中一个可能会解决问题:

在weblogic-application.xml中:

<wls:prefer-application-packages>
    <wls:package-name>org.apache.xerces.xni.parser.*</wls:package-name>
    <wls:package-name>org.apache.xerces.parsers.*</wls:package-name>
    <wls:package-name>org.apache.xalan.*</wls:package-name>
</wls:prefer-application-packages>

org.apache.xerces.xni.parser*
org.apache.xerces.parsers*
org.apache.xalan*
在weblogic.xml中:

<wls:container-descriptor>
    <wls:prefer-web-inf-classes>true</prefer-web-inf-classes>
</wls:container-descriptor>

真的

以后遇到这些问题的人,请参见这些。我最终通过升级到xercesImpl 2.9.0版解决了这个问题。这似乎是解决这个问题的最佳版本,尽管它比OpenSAML要求的版本要低,但它修复了这个问题,同时没有引起Weblogic的任何其他问题(就我目前所遇到的情况而言)。Xerces 2.10.0需要更新版本的xml API才能正常工作,这导致Weblogic出现问题(2.9.0似乎与Weblogic中包含的xml API版本配合使用)

以下方法允许在Weblogic中绑定自定义Xerces和Xalan库:

  • 创建ear存档
    spring-security-saml2-sample.ear
  • 在ear中包含Spring SAML文件
    Spring-security-saml2-sample.war
    ,war应该包含自己版本的Xerces和Xalan
  • 在ear中创建包含以下内容的文件
    META-INF/application.xml

    <application xmlns="http://java.sun.com/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd" version="5">
      <module>
        <web>
          <web-uri>spring-security-saml2-sample.war</web-uri>
          <context-root>spring-security-saml2-sample</context-root>
        </web>
      </module>
    </application>
    
    <weblogic-application xmlns="http://www.bea.com/ns/weblogic/90"
                          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                          xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 http://www.oracle.com/technology/weblogic/920/weblogic-application.xsd">
        <xml>
            <parser-factory>
                <saxparser-factory>
                    org.apache.xerces.jaxp.SAXParserFactoryImpl
                </saxparser-factory>
                <document-builder-factory>
                    org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
                </document-builder-factory>
                <transformer-factory>
                    org.apache.xalan.processor.TransformerFactoryImpl
                </transformer-factory>
            </parser-factory>
        </xml>
        <prefer-application-packages>
            <package-name>org.opensaml.*</package-name>
            <package-name>org.apache.xerces.*</package-name>
            <package-name>org.apache.xalan.*</package-name>
        </prefer-application-packages>                       
    </weblogic-application>
    
  • 部署归档文件


  • 我们的项目打包为war,我们使用第二个选项。它按预期加载较新的JAR,只是看起来它们与Weblogic默认xml解析器不兼容。也许我们还需要其他JAR?很有趣-您是否尝试过手动编译以查看是否存在问题?似乎仍然与weblogic有关,使用的版本与您的AppSimular不同,就我所知,它最终限制了可以更新的内容。很好,感谢您发布答案供其他人查找。感谢您的回答。这可能是最好的办法。
    <weblogic-application xmlns="http://www.bea.com/ns/weblogic/90"
                          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                          xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 http://www.oracle.com/technology/weblogic/920/weblogic-application.xsd">
        <xml>
            <parser-factory>
                <saxparser-factory>
                    org.apache.xerces.jaxp.SAXParserFactoryImpl
                </saxparser-factory>
                <document-builder-factory>
                    org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
                </document-builder-factory>
                <transformer-factory>
                    org.apache.xalan.processor.TransformerFactoryImpl
                </transformer-factory>
            </parser-factory>
        </xml>
        <prefer-application-packages>
            <package-name>org.opensaml.*</package-name>
            <package-name>org.apache.xerces.*</package-name>
            <package-name>org.apache.xalan.*</package-name>
        </prefer-application-packages>                       
    </weblogic-application>