본문 바로가기

Spring/Spring Security

AccessDecisionManager

반응형

인증 : 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