Если это основано на коде из вашего вопроса здесь , то для получения имени пользователя необходимо добавить новое свойство к ресурсу, помеченному @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 , что дает вам имя пользователя и пароль в кодированной строке base64.состоящий из имени пользователя: пароль.Чтобы получить эти значения, вам необходимо выполнить синтаксический анализ, декодирование base64 и повторный анализ.Предоставленная вами команда curl добавит в запрос следующий заголовок:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
В приведенном выше фрагменте кода authHeader
будет иметь значение
Basic dXNlcm5hbWU6cGFzc3dvc.mQ=
Получение имени пользователяи пароль будет выглядеть так:
String[] pair = base64decode(authHeader.split(" ")[1]).split(":");
. В этом коде замените base64decode
выбранной вами библиотекой декодирования base64.После этого вызова имя пользователя будет в pair[0]
, а пароль будет в pair[1]
.Обратите внимание, что во всем этом коде отсутствуют проверки нуля и границ, а также обработка исключений, которая потребуется для производственного кода.Он также поддерживает только базовую аутентификацию.Если вам нужно было поддерживать другие методы аутентификации, вам нужно было бы обрабатывать любые методы декодирования и синтаксического анализа, которые требуются этому методу.
Мне кажется, что JAX-RS больше ориентирован на использование подхода SecurityContext
и опору на контейнерчтобы подтвердить подлинность запроса, поэтому разберитесь со всеми предостережениями, используя подход HttpHeaders
.