2016-10-25 62 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