이 질문 here의 코드에 구축되는 경우, 사용자 이름을 얻는 것은 주석 자원에 새로운 속성을 추가하는 문제이다 @Context
이 javax.ws.rs.core.SecurityContext
인 경우 (securityContext
라고 부름). 그런 다음 다음과 같이 사용자 이름에 액세스 할 수 있습니다
String username = securityContext.getUserPrincipal().getName();
암호하지만이 API를 통해 사용할 수 없습니다. 이 접근법은 사용자가 컨테이너에 의해 이미 인증 된 경우에만 작동합니다. 패스워드를 얻으려면, 속성은 javax.ws.rs.core.HttpHeaders
이어야합니다 (httpHeaders라고 부르 자). 암호 :이 객체를 사용하여, 당신은 당신에게 사용자 이름 구성된 base64로 인코딩 된 문자열에 사용자 이름과 암호를주고, 당신이 HTTP basic authentication를 사용하여 기본 것 나열된 curl 명령을 사용하여
String authHeader = httpHeaders.getRequestHeader("Authorization").get(0);
를 호출해야 할 것이다. 이 값들을 얻기 위해, 파싱,베이스 64 디코드, 그리고 다시 파싱해야 할 필요가 있습니다. 당신이 제공하는 컬 명령은 요청에 다음과 같은 헤더를 추가합니다 :
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
내가 전에 제공되는 코드에서, authHeader
는 값
Basic dXNlcm5hbWU6cGFzc3dvc.mQ=
과 같이 될 것이다 사용자 이름과 암호를 얻기있을 것입니다 선택의 base64로 디코딩 라이브러리 그 코드를 대체 base64decode
에서
String[] pair = base64decode(authHeader.split(" ")[1]).split(":");
. 이 호출 후 사용자 이름은 pair[0]
이고 비밀번호는 pair[1]
입니다. 이 코드는 모두 프로덕션 코드에 필요한 null 처리 및 경계 검사 및 예외 처리가 부족합니다. 또한 기본 인증 만 지원합니다. 다른 인증 방법을 지원해야하는 경우 해당 메소드가 필요로하는 모든 디코딩 및 구문 분석을 처리해야합니다.
JAX-RS는 SecurityContext
접근 방식을 사용하고 요청을 인증하기 위해 컨테이너에 의존하기 때문에, HttpHeaders
접근 방식을 사용하여 모든주의 사항을 이해하십시오.
출처
2011-05-04 04:44:43
laz