[권한 계층 생성&등록]

post-thumbnail

Spring security를 이용한 권한 설정

권한 설정

Admin > User > Visitor 
{관리자>정회원>방문자}

권한계층 생성

@Bean
public RoleHierarchyImpl roleHierarchy() {
    return RoleHierarchyImpl.fromHierarchy("""
        ADMIN > USER > VISITOR
        """);
}

위 코드에서 RoleHierarchyImpl는 Spring Security에서 제공하는 클래스이며, 권한 계층을 설정할 때 사용된다.
보다싶이 Impl이 붙어있기 때문에, 어떠한 인터페이스의 구현체일 것이다.

fromHierarchy는 RoleHierarchyImpl 클래스의 계층관계를 설정하는 메서드이다.

권한 계층 등록

    @Bean
    public DefaultWebSecurityExpressionHandler customWebSecurityExpressionHandler() {
        DefaultWebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
        expressionHandler.setRoleHierarchy(roleHierarchy()); 
        return expressionHandler;
    }

DefaultWebSecurityExpressionHandler: Spring Security의 Expression Handler로, 권한 검사를 처리한다.

예를 들어, @PreAuthorize("hasRole('USER')")와 같은 어노테이션에서 권한 확인을 담당합니다.
setRoleHierarchy: 앞에서 설정한 RoleHierarchyImpl 객체를 등록합니다.
이를 통해 계층적인 권한 구조가 적용됩니다.

전체적인 흐름

권한 계층 생성 빈을 계층 등록 빈에 넣어 DefaultWebSecurityExpressionHandler에 권한 계층을 등록한다.
Spring Security는 이 설정을 기반으로 권한을 검사한다.

권한 처리 설정 후 사용 방법

@PreAuthorize("hasRole('VISITOR')")
public String visitorPage() {
    return "visitorPage";
}

위에 있는 @PreAuthorize("hasRole('VISITOR')")
는 "메서드 보안 어노테이션 "이라고 부르며,
Spring Security의 메서드 보안 기능에서 제공되는 어노테이션 중 하나입니다

주로 컨트롤러 메서드와 서비스 메서드에서 사용된다.

컨트롤러의 API 메서드

@RestController
public class MyController {
    @GetMapping("/visitor")
    @PreAuthorize("hasRole('VISITOR')")
    public String visitorEndpoint() {
        return "Hello, Visitor!";
    }
}

서비스의 메서드

@Service
public class MyService {
    @PreAuthorize("hasRole('USER')")
    public String getUserData() {
        return "User Data";
    }
}

다음과 같이 API와 메서드 접근을 제어하기 위해 사용된다.

profile
내가 있는 그 조직에서 가장 성실하기만 하자

0개의 댓글