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’) |