web-dev-qa-db-ja.com

HTTP基本認証からパスワードを取得する方法

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

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

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

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

30
Jin Kim

参照しているパスワードは、ログイン中にユーザーが提供したパスワードとはおそらく異なる可能性があります。ユースケースは質問から明確ではありませんが、外部ユーザーから提供されたユーザー名/パスワードを使用して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);
}
82
Akhilesh Singh

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

1
artbristol