如果这是基于您的问题here 中的代码,那么获取用户名只需将新属性添加到使用@Context 注释的javax.ws.rs.core.SecurityContext 类型的资源(我们称之为securityContext) .然后你可以像这样访问用户名:
String username = securityContext.getUserPrincipal().getName();
但密码不能通过此 API 获得。此方法仅在用户已通过容器身份验证时才有效。要获取密码,该属性需要是javax.ws.rs.core.HttpHeaders 类型(我们称之为httpHeaders)。使用这个对象,你必须调用
String authHeader = httpHeaders.getRequestHeader("Authorization").get(0);
使用您列出的 curl 命令将默认使用HTTP basic authentication,在包含用户名:密码的 base64 编码字符串中为您提供用户名和密码。要获得这些值,您需要解析、base64 解码并再次解析。您提供的 curl 命令会将以下标头添加到请求中:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
在我之前提供的代码 sn-p 中,authHeader 将具有值
Basic dXNlcm5hbWU6cGFzc3dvc.mQ=
获取用户名和密码是这样的
String[] pair = base64decode(authHeader.split(" ")[1]).split(":");
在该代码中,将 base64decode 替换为您选择的 base64 解码库。在此调用之后,用户名将在 pair[0] 中,密码将在 pair[1] 中。请注意,所有这些代码都缺少生产代码所需的空值和边界检查以及异常处理。它也只支持基本身份验证。如果您需要支持其他身份验证方法,则需要处理该方法所需的任何解码和解析。
在我看来,JAX-RS 更倾向于使用 SecurityContext 方法并依赖容器来验证请求,因此请了解使用 HttpHeaders 方法的所有注意事项。