
AuthorizationFilter 클래스
AuthorizationManager 인터페이스
RequestMatcherDelegatingAuthorizationManager 클래스
AuthorizationManager 를 구현하는 구현체 중 하나RequestMatcherDelegatingAuthorizationManager 가 직접 권한 부여 처리를 하는 것이 아니라 RequestMatcher를 통해 매치되는 AuthorizationManager 구현 클래스에게 위임만 한다.AuthorizationFilter가 SecurityContextHolder로 부터 Authentication을 획득
획득한Authentication과 HttpServletRequest를 AuthorizationManager 에게 전달
RequestMatcherDelegatingAuthorizationManager 내부에서 매치되는 AuthorizationManager 구현 클래스가 있다면 해당 AuthorizationManager 구현 클래스가 사용자의 권한을 체크

URL을 통해 사용자의 액세스를 제한하는 권한 부여 Filter
객체를 생성할 때, AuthorizationManager를 DI 받는다.
DI 받은 AuthorizationManager의 check() 메서드를 호출해 적절한 권한 부여인지에 대한 여부를 체크한다.
AuthorizationManager 구현 클래스에 따라 권한 체크(check()) 로직이 다르다.check() 메서드 하나만 정의되어 있다.check() 메서드는 Supplier와 제너릭 타입의 객체를 파라미터로 갖는다.@FunctionalInterface
public interface AuthorizationManager<T> {
@Nullable
AuthorizationDecision check(Supplier<Authentication> authentication, T object);
}
AuthorizationManager의 구현 클래스 중 하나
직접 권한 부여 처리를 수행하지 않고 RequestMatcher를 통해 매치되는 AuthorizationManager 구현 클래스에게 권한 부여 처리를 위임한다.
RequestMatcher는 SecurityConfiguration에서 .antMatchers("/orders/**").hasRole("ADMIN") 와 같은 메서드 체인 정보를 기반으로 생성된다.Spring Security에서 지원하는 표현식은 아래와 같다.
| 표현식 | 설명 |
|---|---|
| hasRole(Stirng role) | - 현재 보안 주체(principal)가 지정된 역할을 갖고 있는지 여부를 확인하고 가지고 있다면 true를 리턴한다. - hasRole(’admin’)처럼 파라미터로 넘긴 role이 ROLE_ 로 시작하지 않으면 기본적으로 추가한다. (DefaultWebSecurityExpressionHandler의 defaultRolePrefix를 수정하면 커스텀할 수 있다.) |
| hasAnyRole(String… roles) | - 현재 보안 주체가 지정한 역할 중 1개라도 가지고 있으면 true를 리턴한다. (문자열 리스트를 콤마로 구분해서 전달한다.) - ex) hasAnyRole(’admin’, ‘user’) |
| hasAuthority(String authority) | - 현재 보안 주체가 지정한 권한을 갖고 있는지 여부를 확인하고 가지고 있다면 true를 리턴한다. - ex) hasAuthority(’read’) |
| hasAnyAuthority(String… authorities) | - 현재 보안 주체가 지정한 권한 중 하나라도 있으면 true를 리턴한다. - ex) hasAnyAuthority(’read’, ‘write’) |
| principal | - 현재 사용자를 나타내는 principal 객체에 직접 접근할 수 있다. |
| authentication | - SecurityContext로 조회할 수 있는 현재 Authentication 객체에 직접 접근할 수 있다. |
| permitAll | - 항상 true로 평가한다. |
| denyAll | - 항상 false로 평가한다. |
| isAnonymous() | - 현재 보안 주체가 익명 사용자면 true를 리턴한다. |
| isRememberMe() | - 현재 보안 주체가 remember-me 사용자면 true를 리턴한다. |
| isAuthenticated() | - 사용자가 익명이 아닌 경우 true를 리턴한다. |
| isFullyAuthenticated() | - 사용자가 익명 사용자나 remember-me 사용자가 아니면 true를 리턴한다. |
| hasPermission(Object target, Object permission) | - 사용자가 target에 해당 permission 권한이 있으면 true를 리턴한다. ex) hasPermission(domainObject, ‘read’) |
| hasPermission(Object targetId, String targetType, Object permission) | - 사용자가 target에 해당 permission 권한이 있으면 true를 리턴한다. ex) hasPermission(1, ‘com.example.domain.Message’, ‘read’) |