인증 : AuthenticationManager
인가 : AccessDecisionManager
AccessDecisionManager
AccessDecisionManager는 여러개의 voter를 가질 수 있다. 여러 목록의 voter를 거치면서 유효한 지 확인
spring security가 role hierarchy를 이해할 수 있도록, AccessDecisionManager에 설정
Access Control 결정을 내리는 인터페이스로, 구현체 3가지를 기본으로 제공한다.
- AffirmativeBased: 여러 Voter중에 한명이라도 허용하면 허용. 기본 전략.
- ConsensusBased: 다수결
- UnanimousBased: 만장일치
AccessDecisionVoter
- 해당 Authentication이 특정한 Object에 접근할 때 필요한 ConfigAttributes를 만족하는지 확인한다. ( code 에 설정한 role 확인 )
- WebExpressionVoter: 웹 시큐리티에서 사용하는 기본 구현체, ROLE_Xxxx가 매치하는지 확인.
- RoleHierarchyVoter: 계층형 ROLE 지원. ADMIN > MANAGER > USER
- ...
accessDecisionManager 커스터마이징
public AccessDecisionManager accessDecisionManager() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy( "ROLE_ADMIN > ROLE_USER" );
DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler();
handler.setRoleHierarchy( roleHierarchy );
WebExpressionVoter webExpressVoter = new WebExpressionVoter();
webExpressVoter.setExpressionHandler( handler );
List<AccessDecisionVoter<? extends Object>> voters = Arrays.asList( webExpressVoter );
return new AffirmativeBased( voters );
}
@Override
protected void configure( final HttpSecurity http ) throws Exception {
http.authorizeRequests() // 요청을 어떻게 인가할 지에 대한 패턴 설정
.mvcMatchers( "/", "/info", "/account/**" ).permitAll() // spring security filter 내에서 match할 때 사용하는 정보
.mvcMatchers( "admin" ).hasRole( "ADMIN" )
.mvcMatchers( "/user" ).hasRole( "USER" )
.anyRequest().authenticated() // 그 외의 모든 request는 인증한 사용자들에 한해 허용
.accessDecisionManager( accessDecisionManager() );
http.formLogin(); // 스프링 시큐리티 기본 제공 form login을 사용하겠다
http.httpBasic();
}
우리가 쓰던 WebExpressionVoter과 handler 그대로 사용, 우리는 roleHierarchy만 추가해준것!
AccessDecisionManager을 커스터마이징하는 것이 아니라 ExpressionHandler를 커스텀마이징하면, 더 간단하게 할 수 있다.
=> 정리
인증을 필요로하는 각 필터에서
securityContextHolder가 Authentication을 가지고 있고, Authentication은 AuthenticationManager를 통해 인증을 하고, 결과로 나온 Authentication은 다시 securityContextHolder로 들어가게 됨
이러한 필터들은 FilterChainProxy로 묶여있고, 이 FilterChainProxy가 순차적으로 필터들을 실행시켜 준다. 이는 delegatingFilterProxy 에 의해 생성이 됨. (delegatingFilterProxy :스프링 부트가 아닐 경우에는 AbstractSecurityWebApplicationInitializer를 사용하여 등록)
FilterSecurityIntercepter는 AccessDecisionManager를 사용하여 Access Control 또는 예외 처리하는 필터로 FilterChainProxy의 securityProxy 중 하나이다.
'Spring > Spring Security' 카테고리의 다른 글
스프링 시큐리티 아키텍처 (0) | 2020.01.06 |
---|---|
ExceptionTranslationFilter (0) | 2020.01.06 |
Spring Security Architecture (0) | 2019.12.11 |
Spring Security OAuth2 (0) | 2019.08.05 |
Authentication Handler (0) | 2019.08.02 |