私は、ある種の「転送プロキシ」として機能し、本文のいくつかの要素を置き換えてから、別の SOAP サービス (Y) を呼び出す SOAP サービス (X と呼びましょう) を作成しています。Y を呼び出したときに X で受け取るのと同じ WS-Security 資格情報 (プレーンテキストのユーザー名とパスワード) を使用したいのですが、Password 要素の値を取得するのに問題があります。
ファイルで宣言するポリシーは、次wsit-package.service.xml
の実装を参照しますcom.sun.xml.wss.impl.callback.PasswordValidationCallback.PasswordValidator
。
<wsp1_2:Policy wsu:Id="UsernameToken"
xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
xmlns:wsss="http://schemas.sun.com/2006/03/wss/server"
xmlns:wspp="http://java.sun.com/xml/ns/wsit/policy">
<wsp1_2:ExactlyOne>
<wsp1_2:All>
<sp:SupportingTokens>
<wsp1_2:Policy>
<sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/
ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient" />
<sp:IncludeTimestamp />
</wsp1_2:Policy>
</sp:SupportingTokens>
<wsss:ValidatorConfiguration wspp:visibility="private" >
<wsss:Validator name="usernameValidator"
classname="com.service.validator.SecurityValidator" />
</wsss:ValidatorConfiguration>
</wsp1_2:All>
</wsp1_2:ExactlyOne>
</wsp1_2:Policy>
バリデーターでパスワードにアクセスできます。
@Override
public boolean validate(Request request) throws PasswordValidationException {
String password = ((PlainTextPasswordRequest) request).getPassword();
return true;
}
ただし、バリデーターは WebServiceContext にアクセスできないため、サービス エンドポイントにアクセスできる便利な保存場所がありません。
WS-Addressing などの他のヘッダーを使用すると、ハンドラー (の実装SOAPHandler<SOAPMessageContext>
) を使用して値を取り出し、エンドポイントが取得するアプリケーション スコープの下のコンテキストに戻すことができます。WS-Security ヘッダーは、SOAP メッセージがハンドラー チェーンに到達するまでに既に取り除かれているため、ハンドラーでそれらの値を取得する方法はありません。
バリデーターを使用してパスワードをデータベース/グローバル マップ/スレッドローカル ストレージに格納するなどの抜本的なことを行う以外に、エンドポイントで提供された WS-Security パスワードを取得する方法はありますか?
を介してエンドポイントで WS-Security ユーザー名情報にアクセスできますSubject subj = SubjectAccessor.getRequesterSubject(context)
が、これにはパスワードが含まれていないようです。