오늘
AuthorizationFilter 에서 SecurityContextHolder 를 이용해 SecurityContext에 있는 Authentication 을 가져온다.
SecurityContextHolder 에서 받은 Authentication 과 HTTP Servlet Request 를 AuthorizationManager 에게 전달해준다.
AuthorizationManager 권한 부여 처리를 총괄하는 인터페이스이고, RequestMatcherDelegatingAuthorizationManager 는 AuthorizationManager 를 구현하는 클래스다.
RequestMatcherDelegatingAuthorizationManager 는 RequestMatcher 평가식을 기반으로 해당 평가식에 매치되는 AuthorizationManager 구현 클래스에게 사용자의 권한 체크를 위임한다.
적절한 권한이라면 다음 Filter 를 이어가고, 적절한 권한이 아니라면 AccessDeniedException이 throw되고 ExceptionTranslationFilter가 AccessDeniedException을 처리한다.
AuthorizationFilter 도 AuthenticationFilter 처럼 상속받은 클래스의 doFilter()
를 사용한다.
밑의 사진은 AuthorizationFilter 가 상속받은 OncePerRequestFilter 클래스이며, doFilterInternal
이라는 메서드를 사용하고 있는 것을 알 수 있다.
AuthorizationManager 의 메서드인 check 를 이용해서 람다식으로 매개변수를 사용하고 있다.
this::getAuthentication
() -> {
return getAuthentication();
}
getAuthentication 은 바로 밑에 있는 코드로,
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
에서 인증정보를 가져온다.
만약 인가에 실패했다면 AccessDeniedException
에러를 발생시킨다.
정상적으로 인가가 됬다면 맨 마지막 줄인 filterChain.doFilter(request, response);
를 실행시키며 다음 필터로 넘어간다.
RequestMatcherDelegatingAuthorizationManager 클래스는 AuthorizationManager 인터페이스를 구현하고 있다.
아까 AuthorizationFilter 에 있던 this.authorizationManager 는 AuthorizationManager 를 구현하고 있는 RequestMatcherDelegatingAuthorizationManager 다.
check 메서드로 전달받은 정보를
return manager.check(authentication, new RequestAuthorizationContext
에서 사용하는 것을 알 수 있다.
manager 는 77번째 라인에서 mapping.getEntry();
를 통해 만들어지는 객체라는 것을 알 수 있다.
mapping 은 72번째 라인에서 RequestMatcherEntry<AuthorizationManager<RequestAuthorizationContext>> mapping
을 통해 만들어지고 있다.
RequestMatcherEntry 의 내부코드.
getEntry() 는 <AuthorizationManager<RequestAuthorizationContext>>
부분임을 알 수 있고, 즉 AuthorizationManager 의 객체를 가져오는 것이다.
mapping 에는 만들어 줬던 SecurityConfiguration 클래스의 .antMatchers
가 그대로 들어가고 있는 것을 알 수 있다.