2016-05-31 14 views
2

私はapache cxfを使用してjax-wsクライアントを作成しています。 私は春のテキストの構成に苦しんでいます。 私に必要なのは、私のSOAP要求にこのヘッダーを追加することです:UsernameTokenを、パスワード、ログイン:私は3つのパラメータを持っているjax-wsリクエストでセキュリティヘッダーを追加する方法

<soapenv:Header> 
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
    <wsse:UsernameToken wsu:Id="usernametoken"> 
     <wsse:Username>login</wsse:Username> 
     <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>   
    </wsse:UsernameToken> 
    </wsse:Security> 

<jaxws:client id="***" name="***" 
       endpointName="***" 
       serviceName="***" 
       address="***" 
       serviceClass="***" 
       username="***" 
       password="***" 
       xmlns:tns="***"> 
</jaxws:client> 

上記のコードは動作し、セキュリティヘッダーは送信されません。 ヘッダーを追加する方法を教えてください。

答えて

3

使用この構成

<jaxws:client etc...> 
     <jaxws:outInterceptors>  
     <bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor"> 
      <constructor-arg> 
       <map> 
        <entry key="action" value="UsernameToken"/> 
        <entry key="user" value="login"/> 
        <entry key="passwordType" value="PasswordText"/> 
        <entry key="passwordCallbackRef" value-ref="myPasswordCallback"/> 
       </map> 
      </constructor-arg> 
     </bean> 
     </jaxws:outInterceptors> 
    </jaxws:client> 

    <bean id="myPasswordCallback" class="client.ClientPasswordCallback"/> 

そして、このクラスも

Client client = ClientProxy.getClient(port); 
Endpoint cxfEndpoint = client.getEndpoint(); 
Map<String,Object> outProps = new HashMap<String,Object>(); 
outProps.put("action", "UsernameToken"); 
outProps.put("user", "login"); 
outProps.put("passwordType","PasswordText"); 
ClientPasswordCallback c = new ClientPasswordCallback(); 
outProps.put("passwordCallbackRef",c); 

WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps); 
cxfEndpoint.getOutInterceptors().add(wssOut); 
+0

こんにちは、なぜユーザーをチェックする必要がありますか?このコードはクライアント側ですか?サーバー側のこのコードのように見えます。私はエンドポイントを設定していないので、セキュリティーヘッダーを追加してSOAPリクエストを送信したいだけです – rastaman

+0

このコードはクライアント側向けです(jax-ws:clientタグを参照)。アウトインターセプタは、ヘッダーを追加するために送信される前に出力をインターセプトします。 spring設定が気に入らなければ、最後のjavaの例を使用してください。たぶんあなたはパスワードを提供するのに奇妙な方法を見つけたかもしれませんが、それはCXFのデフォルトです – pedrofb

2

セキュリティヘッダーにCXFインターセプターを追加する必要があります。

ですから、基本的に新しいインターセプター豆(CXF-セキュリティからWSS4JOutInterceptor)を定義し、そのコンストラクタへの入力として、正しいキーの値を渡す必要があります。これはhttp://cxf.apache.org/docs/ws-security.htmlで文書化されていることを

<bean id="fooSecurityOutInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor"> 
    <constructor-arg> 
     <map> 
     [...] 
     </map> 
    </constructor-arg> 
</bean> 

注しかし、あなたはありすべての可能なキー(あなたの場合、USERNAME_TOKEN、PASSWORD_TYPE ...を見てください)のソースコードをorg.apache.ws.security.handler.WSHandlerConstantsで見て、このBeanの対応するキーに値を注入したいとします。

次に、このBeanをjaxws-client beanにアウトインターセプターとして割り当てるだけです。

<jaxws:client id="***" name="***" endpointName="***" serviceName="***" address="***" serviceClass="***" xmlns:tns="***"> 
    <jaxws:outInterceptors> 
     <ref bean="fooSecurityOutInterceptor" /> 
    </jaxws:outInterceptors> 
</jaxws:client> 

これはすべきことです。 org.apache.cxf.interceptor.LoggingOutInterceptorのような2番目のインターセプタを追加して、ヘッダーが追加されてキー/値を微調整することを確認できます。あなたはJavaコードを好む場合

+0

こんにちは可能で、パスワード

public class ClientPasswordCallback implements CallbackHandler { public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; if ("login".equals(pc.getIdentifier())) { pc.setPassword("thepassword"); } // else {...} - can add more users, access DB, etc. } } 

を管理することができます。ご回答有難うございます。さて、私はクラスを見つけました:UsernameTokenInterceptorそれは私の問題を解決します。どのように私は春の文脈でそれを追加できますか? – rastaman

関連する問題