쩨이엠 개발 블로그

[ Spring ] SecurityConfig AccessDecisionManager / ExpressionHandler 본문

개발/Spring

[ Spring ] SecurityConfig AccessDecisionManager / ExpressionHandler

쩨이엠 2022. 8. 25. 15:12
728x90
반응형

Spring Project 중 SecurityConfig에서 ROLE을 줄 때 Admin은 User의 롤을 포함한다라는 정책을 줄 때 쓰는 방법

 

 
 @Configuration
 @EnableWebSecurity
 public class SecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Override
    public void configure(HttpSecurity http) throws Exception{
        http.authorizeRequests()
             .mvcMatchers("/admin").hasRole("ADMIN")
             .mvcMatchers("/user").hasRole("USER")
             .expressionHandler(expressionHandler());
//             .accessDecisionManager(accessDecisionManager());
        
    }
    
    public AccessDecisionManager accessDecisionManager(){
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");

        DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler();
        handler.setRoleHierarchy(roleHierarchy);

        WebExpressionVoter voter = new WebExpressionVoter();
        voter.setExpressionHandler(handler);

        List<AccessDecisionVoter<? extends Object>> voters = Arrays.asList(voter);

        return new AffirmativeBased(voters);
    }
    
    public SecurityExpressionHandler expressionHandler(){
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");

        DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler();
        handler.setRoleHierarchy(roleHierarchy);
        return handler;
    }
    
  }

 

User를 빌드 할 때 roles에 ADMIN, USER role을 둘 다 넣는 방법도 있겠지만

여러개의 롤이 생겼을 때엔 하이라키로 세팅해주는게 한 눈에 보기도 좋다.

 

AccessDecisionManager를 직접 configure에 넣어줘도 되지만 지금은 하이라키 세팅만 해주기때문에 accessDecisionManager에서 expressionHandler 부분만 따서 expressionHandler만 추가해줘도 완성

 

728x90
반응형
Comments