Authentication, 모든 구현이 개체 Authentication목록을 저장하는 방법을 설명한다. GrantedAuthority는 본인에게 부여된 권한을 나타낸다.
개체는 GrantedAuthority 개체에 삽입되고 나중에 권한 부여 결정을 내릴때 둘 중 하나에 의해 읽힌다.
아래는 GrantedAuthority 하나의 메서드만 있는 인터페이스다.
String getAuthority();
이 방법을 사용하면 Authorizationmanager의 정확한String 표현을 얻을 수 있다.
Spring Security는 메소드 호출 또는 웹 요청과 같은 보안 객체에 대한 액세스를 제어하는 인터셉터를 제공한다.
AuthorizationManager AccessDecisionManager 및 AccessDecisionVoter을 모두 대체한다.
AccessDecisionManager를 사용 하도록 변경 하거나 사용자 지정하는 응용 프로그램이다.
AuthorizationManagers는 AuthorizationFilter에 의해 호출되며 최종 액세스 제어 결정을 내릴 책임이 있다.
AuthorizationManager 인터페이스에는 두 가지 메서드가 있다.
AuthorizationDecision check(Supplier<Authentication> authentication, Object secureObject);
default AuthorizationDecision verify(Supplier<Authentication> authentication, Object secureObject)
throws AccessDeniedException {
}
사용자가 권한 부여의 모든 측면을 제어하기 위해 자신의 것을 구현할 수 있지만, Spring Security는 Authorizationmanager를 위임한다.

계층적 역할이라는 것은 특정 역할이 다른 역할을 포함하는 것이다.
예를 들어서 USER, MANAGER, ADMIN 3개의 권한이 있다.
(권한은 오름차순으로 높다.)
따라서 MANAGER는 USER의 권한을 가지고 있어야 하고, ADMIN은 USER, MANAGER 2개의 권한을 모두 다 가지고 있어야 한다.
이러한 계층적 역할을 지원하는 RoleVoter은 RoleHierarchyVoter로 구성되어 RoleHierarchy 사용자에게 할당된 모든 접근 가능한 권한을 얻는다.
@Bean
AccessDecisionVoter hierarchyVoter() {
RoleHierarchy hierarchy = new RoleHierarchyImpl();
hierarchy.setHierarchy("ROLE_ADMIN > ROLE_STAFF\n" +
"ROLE_STAFF > ROLE_USER\n" +
"ROLE_USER > ROLE_GUEST");
return new RoleHierarchyVoter(hierarchy);
}