私はJAX-WSを初めて使用しますが、理解できないことがあります。
JAX-WSセキュリティの設定方法に関するチュートリアルはたくさんありますが、ほとんどすべての場合、BindingProvider.USERNAME_PROPERTYとBindingProvider.PASSWORD_PROPERTYはいくつかの.xmlファイルに格納されています(コンテナによって異なります)-それらは「ハードコーディング」されていますあれは。そして、それは私が得られないものです。 BindingProvider.USERNAME_PROPERTYとBindingProvider.PASSWORD_PROPERTYをデータベースにあるユーザー名とパスワードと比較して、Webサービスクライアントを認証するにはどうすればよいですか?次のように、クライアント側でBindingProvider.USERNAME_PROPERTYとBindingProvider.PASSWORD_PROPERTYを設定してみました。
ShopingCartService scs = new ShopingCartService(wsdlURL, name);
ShopingCart sc = scs.getShopingCartPort();
Map<String, Object> requestContext = ((BindingProvider)sc).getRequestContext();
requestContext.put(BindingProvider.USERNAME_PROPERTY, userName);
requestContext.put(BindingProvider.PASSWORD_PROPERTY, password);
sc.someFunctionCall();
そして、サーバー側で次のように取得します:
@Resource
WebServiceContext wsContext;
@WebMethod
public void someFunctionCall() {
MessageContext mc = wsContext.getMessageContext();
mc.get(BindingProvider.USERNAME_PROPERTY);
mc.get(BindingProvider.PASSWORD_PROPERTY);
}
しかし、私は常にnullを取得し、xmlで何も設定しませんでした、Webサービスはうまく動作しますが、それらの変数を取得できないことを除いて:(
Java 1.6、Tomcat 6および JAX-WS の両方で実行しています。
データベースのパスワードを使用してユーザーを認証する方法についてお問い合わせいただきありがとうございます。
サーバーレベルのHTTP基本ではなく、アプリケーションレベルでJAX-WS認証を探していると思います。次の完全な例を参照してください。
Webサービスクライアントサイトで、リクエストヘッダーに「ユーザー名」と「パスワード」を入力します。
Map<String, Object> req_ctx = ((BindingProvider)port).getRequestContext();
req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WS_URL);
Map<String, List<String>> headers = new HashMap<String, List<String>>();
headers.put("Username", Collections.singletonList("someUser"));
headers.put("Password", Collections.singletonList("somePass"));
req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
Webサービスサーバーサイトで、WebServiceContextを介してリクエストヘッダーパラメーターを取得します。
@Resource
WebServiceContext wsctx;
@WebMethod
public String method() {
MessageContext mctx = wsctx.getMessageContext();
Map http_headers = (Map) mctx.get(MessageContext.HTTP_REQUEST_HEADERS);
List userList = (List) http_headers.get("Username");
List passList = (List) http_headers.get("Password");
//...
BindingProvider.USERNAME_PROPERTYとBindingProvider.PASSWORD_PROPERTYは、アプリケーションやサーブレットレベルではなくHTTPレベルで認証プロセスを有効にするHTTP基本認証メカニズムと一致しています。
基本的に、HTTPサーバーのみがユーザー名とパスワードを認識します(そして最終的には、Apache/PHPなどのHTTP /アプリケーションサーバー仕様に従ったアプリケーション)。 Tomcat/Javaを使用して、web.xmlおよび適切なsecurity-constraint/security-roles(後で実際のユーザーのユーザー/グループに関連付けられる役割)にログイン構成BASICを追加します。
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>YourRealm</realm-name>
</login-config>
次に、HTTPサーバー(またはアプリケーションサーバー)レベルのレルムを適切なユーザーリポジトリに接続します。 Tomcatの場合、ニーズに合ったJAASRealm、JDBCRealm、またはDataSourceRealmを確認できます。
私は同じ問題を抱えていて、ここで解決策を見つけました:
http://www.mastertheboss.com/web-interfaces/336-jax-ws-basic-authentication.html?start=1
幸運を
クライアントでSOAPハンドラーでjavax.xml.ws.security.auth.usernameおよびjavax.xml.ws.security.auth.passwordプロパティを次のように設定する必要があります。
public class ClientHandler implements SOAPHandler<SOAPMessageContext>{
public boolean handleMessage(final SOAPMessageContext soapMessageContext)
{
final Boolean outInd = (Boolean)soapMessageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outInd.booleanValue())
{
try
{
soapMessageContext.put("javax.xml.ws.security.auth.username", <ClientUserName>);
soapMessageContext.put("javax.xml.ws.security.auth.password", <ClientPassword>);
}
catch (Exception e)
{
e.printStackTrace();
return false;
}
}
return true;
}
}
アプリケーションレベルの認証とHTTP基本認証の両方を使用する例については、my previous posts のいずれかを参照してください。
同様の状況に直面したため、WSにユーザー名、パスワード、WSSパスワードタイプを提供する必要があります。
最初は「@ahoge」として「Http Basic Auth」を使用していましたが、@ Philipp-Devの参照を使用しようとしました。も。私は成功の解決策を得ることができませんでした。
グーグルで少し深く検索した後、私はこの投稿を見つけました:
https://stackoverflow.com/a/3117841/1223901
そして、私の問題解決策がありました
私の助けのように、これが他の誰にも役立つことを願っています。
Rgds、iVieL