2016-10-25 59 views
0

我正在嘗試使用需要在Mule中使用CXF的安全性的SOAP Web服務。我有它的工作,但我需要把密碼放在一個配置文件。我找不到如何將密碼從配置傳遞給flow/callback類。我的流程是這樣的:在Mule流中使用帶有安全性的SOAP Web服務

<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"/> 

IamPasswordCallback類:

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

這工作得很好,但我需要把密碼進入配置文件中。我通常會這樣做的方法是從IamPasswordCallback中創建一個bean,並在流中設置值並將該bean用於CXF設置中的回調處理程序,但我不知道該配置應該是什麼樣子。另一種方法是加載IamPasswordCallback類中的屬性文件,但我認爲不推薦。

回答

1

如果您使用的是新的wsconsumer組件,則可以直接從配置文件中提供用戶和密碼。

<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> 

如果你必須堅持CXF,那麼你可以使用如下一個Spring bean定義:

在您的全局元素,

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

而且具有以下或類似代碼您的回調類:

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); 
    } 
} 

現在您的CXF的客戶端具有以下配置:

<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

這似乎並不奏效。該物業似乎不想成爲一個字符串? 'java.lang.ClassCastException:za.co.entityapi.IamPasswordCallback不能在org.apache.ws.security.handler.WSHandler.getString被鑄造爲java.lang.String \t(WSHandler.java:1220) \t在org.apache.ws.security.handler.WSHandler.getCallbackHandler(WSHandler.java:923) \t at org.apache.ws.security.handler.WSHandler.getPasswordCallbackHandler(WSHandler.java:939)' –

+0

我使用Mule 3.6。 2 BTW –

+1

噢好吧..這是在3.4工作。我會嘗試一下,讓你知道。 – jvas