WSO2 ESB でプロキシ サービスを作成し、UsernameToken 認証をセットアップしました。ただし、JDK 内にバンドルされている JAX-WS を使用して UsernameToken を構成するのはそれほど簡単ではないようです (ここで説明されているように)。JDK にパッチを適用する必要があります。UsernameToken のように、ESB の資格情報で基本 HTTP 認証を使用する方法はありますか?
1 に答える
Amila Suriarachchiの記事「Web サービス統合のセキュリティ保護」によると、 「WSO2 carbon は POX メッセージを変換することで、HTTP 基本認証でも UT をサポートします」とありますが、これがあなたの興味に関連するかどうかはわかりません。
ただし、JAX-WS クライアントで UsernameToken 承認を構成することは、思ったほど難しくありません。javax.xml.ws.handler.soap.SOAPHandler を実装するクラスを作成し、handleMessage(SOAPMessageContext messageContext) メソッドをオーバーライドして送信メッセージにセキュリティ ヘッダーを追加するだけです。
私の Java バージョンは 1.6.0_26 (上記のパッチは適用されていません) であり、Web サービス クライアント スタブ クラスは、Web サービスの wsdl に従って JAX-WS RI 2.1.7 によって生成され、UsernameToken シナリオによって保護され、公開されます。 WSO2 Carbon サーバー (つまり、Data Services Server-2.6.3) による
セキュリティ ヘッダーの作成にはApache WSS4Jを使用します。この場合は、org.apache.ws.security.message.WSSecUsernameToken オブジェクトをインスタンス化し、setUserInfo(String user, String password) メソッドを介してユーザー名とパスワードを設定するだけです。また、発信 SOAP メッセージのセキュリティ ヘッダーにタイムスタンプ要素を追加する必要があります。サンプル実装は次のようになります。
public boolean handleMessage(SOAPMessageContext messageContext) {
Boolean isOutboundMessage = (Boolean) messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (isOutboundMessage) {
SOAPPart messageSoapPart = messageContext.getMessage().getSOAPPart();
WSSecHeader securityHeader = new WSSecHeader();
securityHeader.insertSecurityHeader(messageSoapPart);
WSSecUsernameToken usernameToken = new WSSecUsernameToken();
usernameToken.setPasswordType(WSConstants.PASSWORD_TEXT);
usernameToken.setUserInfo("root", "top_secret");
WSSecTimestamp timestamp = new WSSecTimestamp();
usernameToken.build(messageSoapPart, securityHeader);
timestamp.build(messageSoapPart, securityHeader);
}
return true;
}
言及すべきもう 1 つの重要な点は、SOAP ヘッダー要素に mustUnderstand グローバル SOAP 属性が付属している可能性があることです。Jim White による記事Working with Headers in JAX-WS SOAPHandlers を参照すると、この属性は、Web サービスの受信者または仲介者がメッセージを処理する前にヘッダー要素を理解する必要があるかどうかを示すために使用されます。
mustUnderstand 要素が true に設定されている場合 (soapenv:mustUnderstand="1")、 getHeaders() メソッドをコーディングして、SOAP ハンドラーが一連のヘッダー要素を返すことによって mustUnderstand ヘッダー要素を処理することをランタイム環境に伝える必要があります。 mustUnderstand ヘッダー要素に一致する QName (修飾名) オブジェクト。以下は、Security ヘッダーを処理する getHeaders() メソッドです。
public Set<QName> getHeaders() {
final String NAMESPACE_URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
final String LOCAL_PART = "Security";
final String PREFIX = "wsse";
final QName wssecurity = new QName(NAMESPACE_URI, LOCAL_PART, PREFIX);
final Set<QName> headers = new HashSet<QName>();
headers.add(wssecurity);
return headers;
}
最後に、サービス ポートを取得してそのメソッドを呼び出す前に、上記のクラス (たとえば、UsernameTokenSecuritySoapHandler) のインスタンスを Web サービス クライアントのハンドラー チェーンに登録する必要があります。これは、次のコードを使用して実行できます。
Service service = new Service();
service.setHandlerResolver(new HandlerResolver() {
public List<Handler> getHandlerChain(PortInfo portInfo) {
List<Handler> handlers = new ArrayList<Handler>();
handlers.add(new UsernameTokenSecuritySoapHandler());
return handlers;
}
});
さらに、Young Yang による JAX-WS API のハンドラ フレームワークに関する優れた記事をここで見つけることができます。
お役に立てれば。