ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스프링] 시큐리티 - 7 (AccessDecisionManager)
    Spring 2020. 10. 11. 16:25

    - 참고 : 인프런 >>스프링 시큐리티 (백기선 강의)

     

     

    인증 ? AuthenticationManager

     

    인가 ? AccessDecisionManager

     

    AccessDecisionManager

    Access Control 결정을 내리는 인터페이스로 여러개의 voter를 가질 수 있다. 여러 목록의 voter를 거치면서 유효한 지 확인

    스프링 시큐리티가 기본적으로 3개의 인터페이스 구현체를 제공

     

    • AffirmativeBased: 여러 Voter중에 한명이라도 허용하면 허용. 기본 전략.
    • ConsensusBased: 다수결
    • UnanimousBased: 만장일치

     

     * AccessDecisionVoter

     

    특정 오브젝트에 접근 할 때, 만족하는지 확인

     

    • WebExpressionVoter: 웹 시큐리티에서 사용하는 기본 구현체, ROLE_Xxxx가 매치하는지 확인.
    • RoleHierarchyVoter: 계층형 ROLE 지원. ADMIN > MANAGER > USER

     

    AccessDecisionManager 커스터마이징

     

    계층형 ROLE 설정

    @Configuration
    @EnableWebSecurity
    @RequiredArgsConstructor
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    	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 = new ArrayList<>();
    		voters.add(webExpressionVoter);
    
    		return new AffirmativeBased(voters);
    	}
    
    	@Override
    	protected void configure(HttpSecurity http) throws Exception {
    
    		http.authorizeRequests()
    			.mvcMatchers("/", "/info", "/account/**").permitAll()
    			.mvcMatchers("/admin").hasRole("ADMIN")
    			.anyRequest().authenticated()
    			.accessDecisionManager(accessDecisionManager());
    
    		http.formLogin();
    		http.httpBasic();
    	}
    
    }

     

    댓글

Designed by Tistory.