제 3 자 인증 서비스가 처리하는 웹 응용 프로그램에 대한 인증을 가진 기존의 Spring Boot Application이 있습니다. SiteMinder와 마찬가지로 타사 서비스는 HTTP 요청에 헤더 (예 : USER_HEADER)를 주입합니다. 이 HTTP 헤더를 추출하고 스프링 보안 @AuthenticatedPrincipal
주석을 통해 MVC 레이어의 컨트롤러에서 사용 가능한 Auth 객체를 만들도록 기존 앱을 구성해야합니다.Spring Security HeaderPreAuthentication Principal가 @AuthenticationPrincipal에서 해결되지 않음
이 프로젝트는 자바 봄 부팅 응용 프로그램 버전 1.1.9.RELEASE, 8.
주 을 그 (아래의 코드는 기능을 미러링하는 테스트 프로젝트에서이다) 이 응용 프로그램은 Java Config 전용입니다. 어떤 XML 내가 요청 헤더에서 사용자 이름을 잡기 위해 필터 체인에 RequestHeaderAuthenticationFilter
를 사용하고 주입해야한다는 것을 알고 Spring Security reference 및 기타 다양한 기사를 통해 파고에 의해 (내 리드에서 위임)
을 허용하지 않습니다.
필터 : 당신이 볼 수있는
public class HeaderAuthenticationFilter extends RequestHeaderAuthenticationFilter {
private static final Logger logger = LoggerFactory.getLogger(HeaderAuthenticationFilter.class);
private final String HEADER = "USER_HEADER";
public HeaderAuthenticationFilter() {
super();
this.setPrincipalRequestHeader(HEADER);
// This setting returns an HTTP 404 with no error message instead of an HTTP 500 with the "missing header" exception message
this.setExceptionIfHeaderMissing(false);
}
@Override
protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
logger.debug("Authorizing URI: " + request.getRequestURI());
try {
return super.getPreAuthenticatedPrincipal(request);
} catch(PreAuthenticatedCredentialsNotFoundException e) {
logger.error("Could not find request header " + HEADER + " in request", e);
return null;
}
}
}
아주 기본적인 필터.
코드를 사용하면 HTTP 요청에서 사용자가 추출되어 PreAuthenticatedAuthenticationToken이 사용자 정의 AuthenticationManager에 의해 작성되고 PreAuthentication 프로세스가 User 비즈니스 객체가 주체로 토큰에 주입되며 토큰은 마지막으로 SecurityContext에 할당됩니다. SecurityContextHolder.getContext(). setAuthentication (principal);
그러나 컨트롤러 메서드에 @AuthenticationPrincipal User user
으로 주석을 추가하면 반환되는 User 개체는 null 인 User 개체입니다. 메서드 매개 변수를 Authentication user
으로 변경하고 user.getPrincipal()
을 명시 적으로 호출하면 사용자 개체가 정상적으로 처리됩니다. @AuthenticationPrincipal이 이와 같이 실패하는 이유가 있습니까?
감사합니다. 자세한 정보가 필요하면 알려주세요.