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 |