오늘의하루

Spring Security - 권한 계층 구조 설정 (RoleHierarchy) 본문

Spring/Security

Spring Security - 권한 계층 구조 설정 (RoleHierarchy)

오늘의하루_master 2024. 5. 10. 09:34

 

 

 

GitHub - dukbong/Practice-Spring-Security: 세션 기반 인증 - 예시

세션 기반 인증 - 예시. Contribute to dukbong/Practice-Spring-Security development by creating an account on GitHub.

github.com

RoleHierarchy 사용목적

RoleHierarchy는 Spring Security에서 역할(Role) 간의 계층 구조를 정의하여 권한을 상속받을 수 있게 하는 유용한 기능입니다.

이를 통해 권한 간의 관계를 설정하고, 코드의 가독성을 향상시킬 수 있습니다.

예를 들어, 계층 구조를 설정하면 상위 역할이 하위 역할을 자동으로 포함하므로, 보안 정책을 간단하고 효율적으로 관리할 수 있습니다.

RoleHierarchy 사용방법

다음은 RoleHierarchy를 설정하고 사용하는 기본적인 예시입니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig {
	
    @Bean RoleHierarchy roleHierarchy() {
    	RoleHierarchyImpl roleHierarchyImpl = new RoleHierarchyImpl();
        roleHierarchyImpl.setHierarchy("ROLE_D > ROLE_C > ROLE_B > ROLE_A");
        return roleHierarchyImpl;
    }
    
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    	http.authorizeHttpRequest(auth -> {
        	auth.requestMatchers("/user").hasAnyRole("A");
                auth.requestMatchers("/manager").hasAnyRole("B");
                auth.requestMatchers("/admin").hasRole("C");
                auth.requestMatchers("/secert").hasRole("D");
        });
    }
    
}

이 코드는 "ROLE_D > ROLE_C > ROLE_B > ROLE_A" 계층 구조를 설정하고, 특정 경로에 대한 권한을 부여하는 예시입니다.

여기서 "ROLE_D"는 가장 높은 권한이며, 이 계층 구조에 따라 "ROLE_C" 이하의 권한을 가진 모든 사용자는 "ROLE_D"에 포함됩니다.

RoleHierarchy 사용시 주의할 점

`RoleHierarchy`는 계층 구조에 따라 권한을 상속하므로, 특정 역할을 가진 사용자가 다른 역할에 접근할 수 있습니다.

예를 들어, /admin 경로에 hasRole("C")를 사용하면 "ROLE_C"는 물론 "ROLE_D"도 접근할 수 있습니다.

이 때문에 특정 경로에 대한 제한을 강화하려면 RoleHierarchy에서 해당 관계를 제거해야 합니다.

계층 구조 변경으로 특정 권한 제한

@Bean
public RoleHierarchy roleHierarchy() {
    RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
    roleHierarchy.setHierarchy("ROLE_D > ROLE_B > ROLE_A"); // ROLE_C 제거
    return roleHierarchy;
}

이러한 변경으로 계층 구조를 조정하여 특정 권한을 가진 사용자가 접근할 수 있는 범위를 제한할 수 있습니다.

Comments