본문 바로가기

심화 캠프 정리

PreAuthorize

@PreAuthorize 애너테이션은 무엇인가?

메서드 호출전에 특정한 조건을 체크하여 접근을 허용하거나 거부하는 기능이다.

Spring Expression Language 기능을 사용하여 복잡한 권한 조건도 간단하게 표현을 가능하게 해 준다.

SpEL는 아래의 링크로 확인 가능하다.

출처: https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/expressions.html

 

8. Spring Expression Language (SpEL)

This section introduces the simple use of SpEL interfaces and its expression language. The complete language reference can be found in the section Language Reference. The following code introduces the SpEL API to evaluate the literal string expression 'Hel

docs.spring.io

PreAuthorize의 제일 중요한 특징은 다음과 같다

  • 메서드 수준에서의 권한제어를 할 수 있다
  • 컨트롤러 서비스 등 계층 어디에서나 사용이 가능하다
  • 비즈니스 로직과 보안 로직을 분리 가능하기 때문에 보안과 가독성을 높일 수 있다. 

사용 방법은 다음과 같다.

일단 Spring Security를 구현하여 user에 대한 권한이 있는 환경을 구성

다음으로 권한을 부여할 메서드가 있다면 아래와 같이 구성 후에

@RestController
@RequestMapping("/api/v1")
@Tag(name = "테스트 관련 API")
public class testController {
	
	@PreAuthorize("hasRole('MASTER')")
	@GetMapping("/test")
	public ResponseEntity<?> testPreAuthorize(
		@AuthenticationPrincipal UserDetailsImpl userDetails
	){
		return ResponseEntity.ok("마스터 권한 통과" + userDetails.getUser().getUsername());
	}

}

마스터 계성을 생성하고 테스트를 진행해 보면 간단하게 통과하는 것을 확인할 수 있다.

그럼 다른 CUSTOMER 계정으로 테스트를 진행하면?

위와 같은 결과로 권한이 없어 거부당한다.

여기서 확인할 수 있는 단점은 어디서 에러가 터졌는지 정확한 확인이 어렵다는 것이다.

단위 테스트로 보면 확인이 가능하나 통합테스트 기준으로 본다면 확인하기 어려울 것이다.

'심화 캠프 정리' 카테고리의 다른 글

ModelAttribute  (0) 2024.11.20
PageableArgumentResolver  (0) 2024.11.20
동적쿼리 BooleanExpression  (0) 2024.11.20
동적쿼리 OrderSpecifier  (0) 2024.11.20
생성자 수정자 자동으로 생성하기  (0) 2024.11.19