如何从 HTTP 基本身份验证获取密码

2022-09-01 01:43:50

我正在使用JAVA的HTTP BASIC Authentication。

我的 Servlet 发送 JMS 消息,但我需要在创建连接时提供用户和密码来验证自己的身份:

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

我可以从HttpServletRequest.getUserPrincipal()中检索用户名。但是似乎没有办法检索密码。我该如何解决这个问题?


答案 1

您引用的密码很可能与用户登录时提供的密码不同。虽然从问题中不清楚用例,但似乎您正在尝试使用外部用户提供的用户名/密码来创建与JMS连接工厂的连接。这对我来说在架构上并不安全。您应该只使用一个凭据连接到需要保护的ConnectionFactory(将其视为数据库连接)。更好的方法是使用JNDI查找ConnectionFactory并绕过用户名/密码管理内容。

但是,如果您必须使用该技术,则可以使用以下代码块。我正在从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);
}

答案 2

用户名和密码最初是以HTTP标头(base64编码)发送的,因此您可以使用它;但是,如果用户使用cookie维护会话,则不一定会每次都发送该标头。Authorization


推荐