2012-09-05 18 views
5

新しいWebサービスに認証ヘッダー(SOAPヘッダー要求の一部として)を組み込む必要があります。その認証ヘッダーは、ユーザーIDとパスワードの詳細を確認します。私は、Webサービスでの認証のためのリクエストヘッダーの詳細の内容を確認する必要があります。認証されると、リクエストのSOAP本体が処理されます。そうでない場合、無効な認証メッセージが、Webサービスによってサービスを呼び出すクライアントアプリケーションに返送されます。SOAPヘッダーの要素を認証​​に追加する

SOAPヘッダーにいくつかの要素(私の場合はuserIdやパスワードなどの認証要素)が含まれるWebサービスの作成方法を理解できません。

通常、サービスで公開されるどのようなメソッドもSOAP本体の一部として提供されます。したがって、SOAPヘッダーに認証要素を追加する方法を混乱させます。

よろしく、

+0

誰でもこれを見ることができますか? https://stackoverflow.com/questions/43002576/soap-header-xmlnsds-on-each-element-for-xml-signature-generation –

答えて

4

を助けてください最近、私はSOAPヘッダにユーザーの資格情報を追加するクラスを書いています。これを行うには、SOAPHandler<SOAPMessageContext>インターフェイスを実装するクラスを作成する必要があります。私はちょうどヘッダに認証情報を追加してtrueを返しています例えば:

public class MyHandler implements SOAPHandler<SOAPMessageContext> { 

    private static final Logger LOGGER = LoggerFactory.getLogger(MyHandler.class); 

    private String username; 

    private String password; 

    /** 
    * Handles SOAP message. If SOAP header does not already exist, then method will created new SOAP header. The 
    * username and password is added to the header as the credentials to authenticate user. If no user credentials is 
    * specified every call to web service will fail. 
    * 
    * @param context SOAP message context to get SOAP message from 
    * @return true 
    */ 
    @Override 
    public boolean handleMessage(SOAPMessageContext context) { 
     try { 
      SOAPMessage message = context.getMessage(); 
      SOAPHeader header = message.getSOAPHeader(); 
      SOAPEnvelope envelope = message.getSOAPPart().getEnvelope(); 
      if (header == null) { 
       header = envelope.addHeader(); 
      } 
      QName qNameUserCredentials = new QName("https://your.target.namespace/", "UserCredentials"); 
      SOAPHeaderElement userCredentials = header.addHeaderElement(qNameUserCredentials); 

      QName qNameUsername = new QName("https://your.target.namespace/", "Username"); 
      SOAPHeaderElement username = header.addHeaderElement(qNameUsername); 
      username.addTextNode(this.username); 
      QName qNamePassword = new QName("https://your.target.namespace/", "Password"); 
      SOAPHeaderElement password = header.addHeaderElement(qNamePassword); 
      password.addTextNode(this.password); 

      userCredentials.addChildElement(username); 
      userCredentials.addChildElement(password); 

      message.saveChanges(); 
      //TODO: remove this writer when the testing is finished 
      StringWriter writer = new StringWriter(); 
      message.writeTo(new StringOutputStream(writer)); 
      LOGGER.debug("SOAP message: \n" + writer.toString()); 
     } catch (SOAPException e) { 
      LOGGER.error("Error occurred while adding credentials to SOAP header.", e); 
     } catch (IOException e) { 
      LOGGER.error("Error occurred while writing message to output stream.", e); 
     } 
     return true; 
    } 

    //TODO: remove this class after testing is finished 
    private static class StringOutputStream extends OutputStream { 

     private StringWriter writer; 

     public StringOutputStream(StringWriter writer) { 
      this.writer = writer; 
     } 

     @Override 
     public void write(int b) throws IOException { 
      writer.write(b); 
     } 
    } 

    @Override 
    public boolean handleFault(SOAPMessageContext context) { 
     LOGGER.debug("handleFault has been invoked."); 
     return true; 
    } 

    @Override 
    public void close(MessageContext context) { 
     LOGGER.debug("close has been invoked."); 
    } 

    @Override 
    public Set<QName> getHeaders() { 
     LOGGER.debug("getHeaders has been invoked."); 
     return null; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 
} 

注意ください。あなたはメッセージ全体で何をしたいのかを行い、何かが失敗するとfalseを返します。

私はこの1つのクライアント実装しました:

<bean id="soapHandler" class="your.package.MyHandler"> 
    <property name="username" value="testUser"/> 
    <property name="password" value="testPassword"/> 
</bean> 

<jaxws:client "..."> 
    <jaxws:handlers> 
     <ref bean="soapHandler"/> 
    </jaxws:handlers> 
</jaxws:client> 

をしかし、それはまた、endpointに実装することができます。

+0

はい、javax.xml.ws.handler.soapパッケージに由来します。 JAX-RPCで動作するかどうかわかりませんが、JAX-WSでのみ使用しました。試してみてください: –

+1

ここには、IBMのJAX-RPCハンドラについて読むべきリンクがあります。http://www.ibm.com/developerworks/webservices/library/ws-tipjax2/index.html –

+0

ハンドラがあり、そのハンドラにメッセージを受け取ることができれば、メッセージに何かできることを意味します。 RPCスタイルのメッセージを修正する方法を理解するだけで済みます。 JAX-RPCを介してどのように実行されるかの例は次のとおりです。http://www.ibm.com/developerworks/xml/library/ws-tip-extend/index.html –

0

私たちはsoapメッセージからではなく、封筒からヘッダーを取得できます。

関連する問題