1. 소개

Spring Security에서는 때때로 인증 된 사용자가 특정 역할을 가지고 있는지 확인해야합니다. 이것은 우리의 응용 프로그램에서 특정 기능을 활성화하거나 비활성화하는 데 유용 할 수 있습니다 .

이 튜토리얼에서는 Spring Security를 ​​위해 Java에서 사용자 역할을 확인하는 다양한 방법을 살펴 봅니다.

2. Java에서 사용자 역할 확인

Spring Security는 Java 코드에서 사용자 역할을 확인하는 여러 가지 방법을 제공합니다 . 아래에서 각각을 살펴 보겠습니다.

2.1. @PreAuthorize

Java에서 사용자 역할을 확인하는 첫 번째 방법은 Spring Security에서 제공 하는 @PreAuthorize 어노테이션 을 사용하는 입니다. 이 어노테이션은 클래스 또는 메소드에 적용 할 수 있으며 SpEL 표현식 을 나타내는 단일 문자열 값을 허용합니다 .

이 어노테이션을 사용하려면 먼저 전역 메서드 Security을 활성화해야합니다. 이는 모든 구성 클래스에 @EnableGlobalMethodSecurity 어노테이션을 추가하여 Java 코드에서 수행 할 수 있습니다 .

그런 다음 Spring Security는 @PreAuthorize 어노테이션 과 함께 사용할 수있는 두 가지 표현식제공 하여 사용자 역할을 확인합니다.

@PreAuthorize("hasRole('ROLE_ADMIN')")
@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") String id) {
    ...
}

단일 표현식에서 여러 역할을 확인할 수도 있습니다.

@PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_MANAGER')")
@GetMapping("/users")
public String getUsers() {
    ...
}

이 경우, 요청은 사용자가있는 경우 허용되는 모든 지정된 역할을.

적절한 역할없이 메서드가 호출되면 Spring Security는 예외를 throw하고 오류 페이지로 리디렉션 합니다 .

2.2. SecurityContext

Java 코드에서 사용자 역할을 확인할 수있는 다음 방법은 SecurityContext 클래스를 사용하는 것입니다.

기본적으로 Spring Security는이 클래스의 스레드 로컬 복사본을 사용합니다. 즉, 애플리케이션의 각 요청에는 요청하는 사용자의 세부 정보가 포함 된 Security 컨텍스트가 있습니다 .

이를 사용하려면 SecurityContextHolder 에서 정적 메서드를 호출하기 만하면됩니다 .

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null && auth.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ADMIN"))) {
    ...
}

여기서는 전체 역할 이름 대신 일반 기관 이름을 사용하고 있습니다.

이는 예를 들어 단일 메서드의 특정 부분과 같이보다 세분화 된 검사가 필요할 때 잘 작동합니다. 그러나 Spring Security에서 전역 컨텍스트 홀더 모드를 사용하면이 접근 방식이 작동하지 않습니다 .

2.3. UserDetailsService

Java 코드에서 사용자 역할을 조회 할 수있는 세 번째 방법은 UserDetailsService 를 사용하는 것 입니다. 이것은 우리가 애플리케이션에 어디에 든 주입하고 필요에 따라 호출 할 수있는 빈입니다.

@GetMapping("/users")
public String getUsers() {
    UserDetails details = userDetailsService.loadUserByUsername("mike");
    if (details != null && details.getAuthorities().stream()
      .anyMatch(a -> a.getAuthority().equals("ADMIN"))) {
        // ...
    }
}

다시 말하지만 여기서는 접두사가있는 전체 역할 이름이 아니라 권한 이름을 사용해야합니다.

이 접근 방식의 장점은 요청한 사람뿐만 아니라 모든 사용자의 역할을 확인할 수 있다는 것 입니다.

2.4. 서블릿 요청

우리가 사용하는 경우 스프링 MVC를 , 우리는 또한 사용하여 Java에서 사용자 역할을 확인하실 수 있습니다 HttpServletRequest의 클래스를 :

@GetMapping("/users")
public String getUsers(HttpServletRequest request) {
    if (request.isUserInRole("ROLE_ADMIN")) {
        ...
    }
}

3. 결론

이 기사에서는 Spring Security와 함께 Java 코드를 사용하여 역할을 확인하는 여러 가지 방법을 살펴 보았습니다.

항상 그렇듯이이 기사의 코드 예제는 GitHub 에서 찾을 수 있습니다 .