42

Java で HTTP BASIC 認証を使用しています。

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

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

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

4

3 に答える 3

125

あなたが参照しているパスワードは、ログイン中にユーザーが提供したものとはおそらく異なります。ユースケースは質問から明確ではありませんが、外部ユーザーから提供されたユーザー名/パスワードを使用して JMS 接続ファクトリーへの接続を作成しようとしているようです。これは、アーキテクチャ的に安全とは思えません。保護する必要がある ConnectionFactory への接続には、資格情報を 1 つだけ使用する必要があります (db 接続のように扱います)。JNDI を使用して ConnectionFactory をルックアップし、ユーザー名/パスワード管理をバイパスすることをお勧めします。

ただし、この手法を使用する必要がある場合は、次のコード ブロックを使用できます。Eclipse で開いていたので、Gitblit プロジェクトからコピーしています。

Java8 Base64 クラスの使用:

final String authorization = httpRequest.getHeader("Authorization");
if (authorization != null && authorization.toLowerCase().startsWith("basic")) {
    // Authorization: Basic base64credentials
    String base64Credentials = authorization.substring("Basic".length()).trim();
    byte[] credDecoded = Base64.getDecoder().decode(base64Credentials);
    String credentials = new String(credDecoded, StandardCharsets.UTF_8);
    // credentials = username:password
    final String[] values = credentials.split(":", 2);
}
于 2013-04-14T15:38:57.270 に答える
1

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

于 2013-04-14T17:09:15.687 に答える