2013-04-14 20 views
19

JavaでHTTP基本認証を使用しています。HTTP基本認証からパスワードを取得する方法

私のサーブレットは、JMSメッセージを送りますが、接続を作成しながら、私は自分自身を認証するためにユーザ名とパスワードを提供する必要があります。

javax.jms.ConnectionFactory.createConnection(String username, String password) 

私は(HttpServletRequest.getUserPrincipalからユーザ名を取得することができます)。しかし、パスワードを取得する方法はないようです。これをどうすれば解決できますか?

答えて

57

あなたが参照しているパスワードは、ログイン中にユーザーが提供したパスワードとはおそらく異なるでしょう。ユースケースは質問からは明らかではありませんが、外部ユーザーが提供するユーザー名/パスワードを使用してJMS接続ファクトリへの接続を作成しようとしているようです。これは構造的に私に安全だとは言えません。保護が必要なConnectionFactoryへの接続には、1つの資格証明のみを使用する必要があります(db接続のように扱います)。 JNDIを使用してConnectionFactoryを検索し、ユーザー名/パスワード管理の項目をバイパスする方が良いでしょう。

しかし、あなたが技術を使用しなければならない場合に、次のコードblock.Iを使用することができ、それはJava8のBase64クラスを使用して、私の日食で

開いていたとしてGitblitプロジェクトからそれをコピーしています:

final String authorization = httpRequest.getHeader("Authorization"); 
    if (authorization != null && authorization.startsWith("Basic")) { 
     // Authorization: Basic base64credentials 
     String base64Credentials = authorization.substring("Basic".length()).trim(); 
     String credentials = new String(Base64.getDecoder().decode(base64Credentials), 
       Charset.forName("UTF-8")); 
     // credentials = username:password 
     final String[] values = credentials.split(":",2); 
+0

あなたはアーキテクチャについて正しいです。私はそのアプローチを断念し、信任されていないjavax.jms.ConnectionFactory.createConnection()のアプローチを採用しました。 –

+1

ありがとうございます。それはうまくいったが、うまくいった。しかし、あなたは静的クラスとして 'Base64'を呼び出すことはできません。私はした: Base64 b = new Base64(); \t \t \t文字列資格=新しい文字列(b.decode(base64Credentials)、Charset.forName( "UTF-8")); – iankits

+1

@iankits Java 8のセマンティクスは若干異なります。 –

1

ユーザー名とパスワードは元々、HTTP Authorizationヘッダー(base64エンコード)で送信されていました。ユーザーがCookieを使用してセッションを維持している場合は、毎回そのヘッダーを送信するとは限りません。