24

私は 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 の両方で実行しています。

データベースからのパスワードを使用してユーザーを認証するためのヘルプは非常に高く評価されています, ありがとう.

4

7 に答える 7

20

サーバーレベルのHTTP基本ではなく、アプリケーションレベルでのJAX-WS認証を探していると思います。次の完全な例を参照してください。

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");
    //...
于 2010-12-16T11:25:37.017 に答える
12

BindingProvider.USERNAME_PROPERTY と BindingProvider.PASSWORD_PROPERTY は、アプリケーションやサーブレット レベルではなく、HTTP レベルで認証プロセスを有効にする HTTP 基本認証メカニズムと一致します。

基本的に、HTTP サーバーだけがユーザー名とパスワードを知っています (最終的には、Apache/PHP などの HTTP/アプリケーション サーバー仕様に従ってアプリケーションを処理します)。Tomcat/Java では、ログイン構成 BASIC を web.xml に追加し、適切な security-constraint/security-roles (実際のユーザーのユーザー/グループに後で関連付けられるロール) を追加します。

<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>YourRealm</realm-name>
</login-config>

次に、レルムを HTTP サーバー (またはアプリケーション サーバー) レベルで適切なユーザー リポジトリに接続します。tomcat の場合、ニーズに合った JAASRealm、JDBCRealm、または DataSourceRealm を確認できます。

http://tomcat.apache.org/tomcat-6.0-doc/realm-howto.html

于 2010-01-22T09:47:46.320 に答える
6

私は同じ問題を抱えていて、ここで解決策を見つけました:

http://www.mastertheboss.com/web-interfaces/336-jax-ws-basic-authentication.html?start=1

幸運を

于 2012-01-17T16:23:25.773 に答える
1

アプリケーションレベルでの認証とHTTP基本認証の両方を使用する例については、以前の投稿の1つを参照してください。

于 2012-01-31T09:02:45.443 に答える
1

私は同様の状況に直面していました。WS に提供する必要があるのは、ユーザー名、パスワード、および WSS パスワードの種類です。

最初は「Http Basic Auth」(@ahoge として) を使用していましたが、@Philipp-Dev の ref を使用しようとしました。それも。成功の解決策が得られませんでした。

Googleで少し詳しく検索した後、次の投稿を見つけました。

https://stackoverflow.com/a/3117841/1223901

そして、私の問題解決策がありました

これが私に役立つように、他の誰かに役立つことを願っています。

Rgds、iVieL

于 2012-03-13T16:29:36.197 に答える