SEB_BE_43 / 23.03.17 회고

rse·2023년 3월 19일
0

코드스테이츠_BE_43

목록 보기
56/65

오늘

  • Authorization(인가) 흐름

Authorization 흐름

  1. AuthorizationFilter 에서 SecurityContextHolder 를 이용해 SecurityContext에 있는 Authentication 을 가져온다.

  2. SecurityContextHolder 에서 받은 Authentication 과 HTTP Servlet Request 를 AuthorizationManager 에게 전달해준다.

  3. AuthorizationManager 권한 부여 처리를 총괄하는 인터페이스이고, RequestMatcherDelegatingAuthorizationManager 는 AuthorizationManager 를 구현하는 클래스다.

  4. RequestMatcherDelegatingAuthorizationManager 는 RequestMatcher 평가식을 기반으로 해당 평가식에 매치되는 AuthorizationManager 구현 클래스에게 사용자의 권한 체크를 위임한다.

  5. 적절한 권한이라면 다음 Filter 를 이어가고, 적절한 권한이 아니라면 AccessDeniedException이 throw되고 ExceptionTranslationFilter가 AccessDeniedException을 처리한다.

AuthorizationFilter

AuthorizationFilter 도 AuthenticationFilter 처럼 상속받은 클래스의 doFilter() 를 사용한다.

밑의 사진은 AuthorizationFilter 가 상속받은 OncePerRequestFilter 클래스이며, doFilterInternal 이라는 메서드를 사용하고 있는 것을 알 수 있다.

AuthorizationManager 의 메서드인 check 를 이용해서 람다식으로 매개변수를 사용하고 있다.

this::getAuthentication

 () -> {
 	return getAuthentication();
 }

getAuthentication 은 바로 밑에 있는 코드로,

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

에서 인증정보를 가져온다.

만약 인가에 실패했다면 AccessDeniedException 에러를 발생시킨다.
정상적으로 인가가 됬다면 맨 마지막 줄인 filterChain.doFilter(request, response);
를 실행시키며 다음 필터로 넘어간다.

RequestMatcherDelegatingAuthorizationManager

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 가 그대로 들어가고 있는 것을 알 수 있다.

profile
기록을 합시다

0개의 댓글