2011-01-11 26 views
1

Ich habe Probleme mit Spring WS, um eine Anfrage zu erhalten, die eine Datei angehängt hat und Streaming verwendet. Das Problem ist, ich die folgende Ausnahme erhalten, wenn ich versuche, eine Sicherheits Abfangjäger zu verwenden:Probleme mit Spring WS Streaming-Anlagen mit Security Interceptor

 
2011-01-11 15:10:05,132 DEBUG [org.springframework.ws.soap.server.SoapMessageDispatcher] - 
java.lang.IllegalArgumentException: Error in converting SOAP Envelope to Document 
    at org.springframework.ws.soap.axiom.support.AxiomUtils.toDocument(AxiomUtils.java:135) 
    at org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor.toDocument(Wss4jSecurityInterceptor.java:621) 
    at org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor.validateMessage(Wss4jSecurityInterceptor.java:492) 
    at org.springframework.ws.soap.security.AbstractWsSecurityInterceptor.handleRequest(AbstractWsSecurityInterceptor.java:104) 
    at org.springframework.ws.server.MessageDispatcher.dispatch(MessageDispatcher.java:213) 
    at org.springframework.ws.server.MessageDispatcher.receive(MessageDispatcher.java:168) 
    at org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:88) 
    at org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:57) 
    at org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:230) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:530) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:426) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119) 
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:457) 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:229) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:931) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:361) 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:867) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:245) 
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:113) 
    at org.eclipse.jetty.server.Server.handle(Server.java:337) 
    at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:581) 
    at org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:1020) 
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:775) 
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:228) 
    at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:417) 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:474) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:437) 
    at java.lang.Thread.run(Thread.java:595) 
Caused by: org.apache.axiom.om.OMException: java.util.NoSuchElementException 
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:249) 
    at org.apache.axiom.om.impl.llom.OMNodeImpl.build(OMNodeImpl.java:327) 
    at org.apache.axiom.om.impl.llom.OMElementImpl.build(OMElementImpl.java:706) 
    at org.springframework.ws.soap.axiom.support.AxiomUtils.toDocument(AxiomUtils.java:125) 
    ... 34 more 
Caused by: java.util.NoSuchElementException 
    at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1083) 
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:506) 
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:161) 
    ... 37 more 

ich das Axiom Nachricht Fabrik bin mit:

<bean id="messageFactory" class="org.springframework.ws.soap.axiom.AxiomSoapMessageFactory"> 
    <property name="payloadCaching" value="false"/> 
    <property name="attachmentCaching" value="true"/> 
    <property name="attachmentCacheThreshold" value="1024" /> 
</bean> 

Mein Endpunkt-Mapping verwendet die wss4jSecurityInterceptor:

<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping"> 
    <property name="mappings"> 
     <props> 
      <prop key="{http://www.aquilauk.co.uk/hribulkupload}BulkHRRequest">hriBulkUploadEndpoint</prop> 
     </props> 
    </property> 
    <property name="interceptors"> 
     <list> 
      <!-- <bean class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor"/> --> 
      <ref bean="wss4jSecurityInterceptor"/> 
     </list>    
    </property> 
</bean> 

und mein Sicherheitsabfanger wurde eingerichtet, um sicherzustellen, dass er die Payload nicht verwendet:

<bean id="wss4jSecurityInterceptor" class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor"> 
    <property name="validationActions" value="UsernameToken" /> 
    <property name="validationCallbackHandler" ref="springWSS4JHandler"/> 
    <property name="secureResponse" value="false"/> 
    <property name="secureRequest" value="false" /> 
</bean> 


<bean id="acegiWSS4JHandler" 
    class="org.springframework.ws.soap.security.wss4j.callback.SpringPlainTextPasswordValidationCallbackHandler"> 
    <property name="authenticationManager" ref="authenticationManager"/> 
</bean> 

Regard, Craig

Antwort

0

fand ich die Lösungen für dieses Problem durch Versuch und Irrtum:

Das Problem der Aufbau der wss4jSecurityInterceptor ist, die Linien:

<property name="secureResponse" value="false"/> 
<property name="secureRequest" value="false" /> 

hätte sein sollen:

<property name="validateRequest" value="false" /> 
<property name="validateResponse" value="false" /> 
+0

Hallo Craig, wenn ich hinzufügen der Interceptor überhaupt nicht validiert.Auch ohne Sicherheit Header-Anfrage wird bearbeitet. Ist es das Gleiche oder fehlt mir etwas? – Chakri

1

Ich glaube, dass die Sicherheit Abfangjäger Sie immer noch die Nutzlast verbraucht definiert haben. Es führt nur keine Sicherheitsüberprüfung durch. Die AxiomSoapMessageFactory.createWebServiceMesssage()-Methode sollte aufgerufen werden, um den MessageContext zu erstellen, der dem Sicherheitsabfanggerät bereitgestellt wird. Der Sicherheitsabfanger ignoriert sie dann gemäß dem secureRequest-Flag.

+0

was Änderungen an der Konfiguration des Sicherheitsabfangprogramms würden Sie vornehmen, um sicherzustellen, dass die Methode createWebServiceMessage() aufgerufen wird? –

+0

Ich wollte daraus schließen, dass diese Methode * aufgerufen wurde und dass sie die Payload konsumiert, unabhängig davon, welche Flags auf dem Interceptor gesetzt sind. Unter der Annahme, dass dies richtig ist, müssen Sie möglicherweise payloadCaching auf "true" setzen und sich auf das Zwischenspeichern von Anlagen verlassen, um den Speicherbedarf zu reduzieren. – Dave

+0

Ich habe es ausprobiert, und mit PayloadCaching kann der Sicherheitsabfanger ausgeführt werden, aber ich erhalte einen OutOfMemoryError im Endpoint, wenn er aktiviert ist, selbst wenn ich den Anhang zwischenspeichern würde. –