2015-01-13 35 views
2

제 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이 이와 같이 실패하는 이유가 있습니까?

감사합니다. 자세한 정보가 필요하면 알려주세요.

답변

0

나는이 주석이 문제를 해결 추가 @EnableWebMvcSecurity

내 WebSecurityConfigurerAdapter 클래스에 주석을하지 않았기 때문에 해결되지 않은 @AuthenticationPrincipal이라고 이유