2009-10-23 2 views
19

私はJAX-WSを使い慣れていません。わからないことがあります。ユーザ名とパスワードがデータベースにある場合のJAX-WSとBASIC認証

あり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を取得、私はdidnの私はこれらの変数を取得することはできませんを除いて「Tは、Webサービスがうまく動作しますが、XMLには何も設定:(

を、私は、Java 1.6、Tomcatの6とJAX-WSの両方を実行しているよ。

データベースのパスワードを使用してユーザーを認証する際の助けとなることはありがたいです。 ありがとうございました。

+0

私もnullまだ、SOAPHandlerにBindingProvider.USERNAME_PROPERTYをチェックしようとしました。 – ahoge

答えて

12

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

基本的に、HTTPサーバだけがユーザ名とパスワードを知っています(そして最終的にはApache/PHPなどのHTTP /アプリケーションサーバ仕様に従ってアプリケーションを知ります)。 Tomcat/Javaでは、web.xmlにlogin config BASICと適切な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

19

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

Application Authentication with 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"); 
    //... 
+0

あなたはそのような情報をどこから得たのですか?正式な情報源が必要ですが、十分な情報を持った正式な情報源が見つかりませんでした! –

+3

ここに示した例は、設計が非常に悪く、非常に安全ではありません。セキュリティソリューションを家庭で焼くべきではありません。この例では、安全でないHTTP上でユーザー名とパスワードも転送されます。誰かがネットワークを聴いているなら、それは拾いやすいです。 また、基本認証を設定することも非常に簡単です(snowflakeの回答を参照)。これは、エラーの起こりやすいプログラミングを必要としない、まともなソリューションであり、パスワードは保護されていないネットワーク上で安全です。 –

1

を両方を使用して、例えば、アプリケーションレベルでの認証とHTTP基本認証は、いずれかを参照してください。私のprevious posts

1

私は同様の状況に直面していましたが、WS:Username、Password、およびWSS Password TypeをWSに提供する必要があります。

私は最初に "Http Basic Auth"(@ahogeとして)を使用していましたが、@ Philipp-Devのrefを使用しようとしました。あまりにも。私は成功の解決策を得られなかった。

Googleの少し深い検索した後、私はこの記事を見つけました:私は私に役立ちますように、これは、誰にも役立つことを願って

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

そして、私の問題の解決

がありました。

RGDS、 iVieL

関連する問題