2016-10-25 3 views
0

Ich versuche, einen SOAP-Web-Service, der Sicherheit erfordert mit CXF in Mule konsumieren. Ich habe es funktioniert, aber ich muss das Passwort in eine Konfigurationsdatei legen. Ich kann nicht finden, wie man das Kennwort von der Konfiguration zur Fluß-/Rückrufklasse übergibt. Mein Flow sieht wie folgt aus:Consume SOAP-Web-Service mit Sicherheit in Mule-Fluss

<cxf:jaxws-client 
    clientClass="za.co.iam.service.identitymanager.intf._1.IdentityManager_Service" 
    port="IdentityManager" 
    wsdlLocation="classpath:/wsdl/IdentityManager.wsdl" 
    operation="CheckUserId" doc:name="CXF"> 
    <cxf:ws-security> 
     <cxf:ws-config> 
      <cxf:property key="action" value="UsernameToken Timestamp"/> 
      <cxf:property key="user" value="${security.username}"/> 
      <cxf:property key="passwordType" value="PasswordText"/> 
      <cxf:property key="passwordCallbackClass" value="za.co.iam.IamPasswordCallback"/> 
     </cxf:ws-config> 
    </cxf:ws-security> 
</cxf:jaxws-client> 
<outbound-endpoint address="${iam.webservice}" doc:name="Generic"/> 

Die IamPasswordCallback Klasse:

public class IamPasswordCallback implements CallbackHandler { 
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException 
    { 
    WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; 
    pc.setPassword("********"); 
    } 
} 

Dies funktioniert gut, aber ich muss auch das Passwort in der Konfigurationsdatei setzen. Normalerweise mache ich eine Bean aus IamPasswordCallback und setze den Wert im Fluss und benutze die Bean für den Callback-Handler im CXF-Setup, aber ich weiß nicht, wie diese Konfiguration aussehen soll. Die Alternative ist, die Eigenschaftendatei in der IamPasswordCallback Klasse zu laden, aber ich glaube, dass das nicht empfohlen wird.

Antwort

1

Wenn Sie die neue Komponente wsconsumer verwenden, können Sie den Benutzer und das Kennwort direkt aus der Konfigurationsdatei angeben.

<ws:consumer-config name="Web_Service_Consumer" wsdlLocation="test.wsdl" service="testService" port="test" serviceAddress="${url.endpoint}" doc:name="Web Service Consumer" connectorConfig="HTTP_Request_Config"> 
    <ws:security> 
     <ws:wss-username-token username="${user}" password="${password}" passwordType="TEXT"/> 
    </ws:security> 
</ws:consumer-config> 

Wenn Sie mit CXF halten haben, dann können Sie wie unten eine Feder Bohne Definition verwenden:

In Ihrem globalen Elemente,

<spring:bean id="WSSCallback" name="WSSCallback" class="test.ClientCallback"> 
    <spring:property name="SoapPassword" value="${password}"/> 
</spring:bean> 

Und haben den unten oder ähnlichen Code in Ihre Callback-Klasse:

public class ClientCallback implements CallbackHandler { 
    private String SoapPassword; 
    public String getSoapPassword() { 
     return SoapPassword; 
    } 
    public void setSoapPassword(String soapPassword) { 
     SoapPassword = soapPassword; 
    } 
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { 
     WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; 

     // set the password for our message. 
     pc.setPassword(SoapPassword); 
    } 
} 

Jetzt in Ihrem cxf-Client hat die unten config:

<cxf:jaxws-client enableMuleSoapHeaders="false" doc:name="SOAP" clientClass="client.class" operation="testop" port="testport" wsdlLocation="test.wsdl"> 
    <cxf:ws-security> 
     <cxf:ws-config> 
      <cxf:property key="action" value="UsernameToken"></cxf:property> 
      <cxf:property key="user" value="${user.name}"></cxf:property> 
      <cxf:property key="passwordType" value="PasswordText"></cxf:property> 
      <cxf:property key="passwordCallbackRef" value-ref="WSSCallback"></cxf:property> 
     </cxf:ws-config> 
    </cxf:ws-security>    
</cxf:jaxws-client> 
+0

Das scheint nicht zu funktionieren. Die Eigenschaft scheint keine Zeichenfolge zu sein? 'java.lang.ClassCastException: za.co.entityapi.IamPasswordCallback kann nicht auf java.lang.String gegossen werden \t bei org.apache.ws.security.handler.WSHandler.getString (WSHandler.java:1220) \t bei org.apache.ws.security.handler.WSHandler.getCallbackHandler (WSHandler.java:923) \t bei org.apache.ws.security.handler.WSHandler.getPasswordCallbackHandler (WSHandler.java:939) ' –

+0

Ich benutze Mule 3.6. 2 BTW –

+1

Oh okay .. das funktionierte in 3.4. Ich werde es ausprobieren und Sie wissen lassen. – jvas