public interface AccessDecisionManager {
    void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException;
    boolean supports(ConfigAttribute attribute);
    boolean supports(Class<?> clazz);
}Authorization(인가)를 위한, Access Control 결정을 내리는 인터페이스, 구현체 3가지를 기본으로 제공한다.
- AffirmativeBased: 여러 Voter중에 한명이라도 허용하면 허용, 기본 전략.
- ConsensusBased: 다수결
- UnanimousBased: 만장일치
AccessDecisionVoter
- 해당 Authentication이 특정한 Object에 접근할때 필요한 ConfigAttributes를 만족하는지 확인한다.
- WebExpressionVoter: 웹 시큐리티에서 사용하는 기본 구현체, ROLE_XXXX가 매치하는지 확인
- RoleHierarchyVoter: 계층형 ROLE 지원. admin -> manager -> user
ConfigAttributes

WebSecurityConfigurerAdapter 구현 클래스에서 설정한 정보들
.mvcMatchers("/", "/info", "/account/**").permitAll()
.mvcMatchers("/admin").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
계층 ROLE 설정
1. AccessDecisionManager 커스터마이징
public AccessDecisionManager accessDecisionManager() {
    RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
    roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");
    DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler();
    handler.setRoleHierarchy(roleHierarchy);
    WebExpressionVoter webExpressionVoter = new WebExpressionVoter();
    webExpressionVoter.setExpressionHandler(handler);
    List<AccessDecisionVoter<? extends Object>> voters = Arrays.asList(webExpressionVoter);
    return new AffirmativeBased(voters);
}
2. ExpressionHandler 커스터마이징(AccessDecisionManager의 voter의 handler만 커스터마이징)
    public SecurityExpressionHandler expressionHandler() {
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");
        DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler();
        handler.setRoleHierarchy(roleHierarchy);
        return handler;
    }
'스터디-Spring' 카테고리의 다른 글
| [스프링 시큐리티] ExceptionTranslationFilter (0) | 2022.01.17 | 
|---|---|
| [스프링 시큐리티] FilterSecurityIntercepter (0) | 2022.01.17 | 
| [스프링 시큐리티] DelegatingFilterProxy와 FilterChainProxy (0) | 2022.01.13 | 
| [스프링 시큐리티] Filter와 FilterChainProxy (0) | 2022.01.12 | 
| [스프링 시큐리티] Authentication과 SecurityContextHolder (0) | 2022.01.11 |