JavaでHTTP BASIC認証を使用しています。
サーブレットはJMSメッセージを送信しますが、接続の作成中に自分自身を認証するためにユーザーとパスワードを提供する必要があります。
javax.jms.ConnectionFactory.createConnection(String username, String password)
HttpServletRequest.getUserPrincipal()からユーザー名を取得できます。しかし、パスワードを取得する方法はないようです。これをどうやって解決しますか?
参照しているパスワードは、ログイン中にユーザーが提供したパスワードとはおそらく異なる可能性があります。ユースケースは質問から明確ではありませんが、外部ユーザーから提供されたユーザー名/パスワードを使用して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);
}
ユーザー名とパスワードは元々HTTP Authorization
ヘッダー(base64エンコード)で送信されたため、使用できます。ただし、ユーザーがCookieを使用してセッションを維持している場合、毎回そのヘッダーを送信する必要はありません。