반응형
"Spring Security를 사용할 때, 유저 인증 정보가 없을 때 @AuthenticationPrincipal을 사용하면 어떻게 될까?"에 대한 의문으로 예외를 던질지, null을 반환할지 궁금해서 인증 정보에 접근하는 방법들을 찾아봤다. 결론부터 말하자면 모두 SecurityContextHolder에서 Authentication 클래스를 사용하는 것이고, 인증 정보가 없다면 예외가 아니라 null을 반환한다. Spring Security를 사용할 때, 인증 정보가 담긴 Authentication 객체에 접근하는 방법을 알아보자.
1. SecurityContextHolder 사용
SecurityContextHolder 클래스는 싱글턴 클래스처럼 전역적으로 접근 가능하다. 현재 스레드의 인증 정보를 저장하고 있기 때문에 Authentication 객체에 접근할 수 있다.
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.isAuthenticated()) {
// 사용자의 세부 정보에 접근
}
2. @AuthenticationPrincipal 사용
컨트롤러의 인자로 @AuthenticationPrincipal 애너테이션을 적용하면 SecurityContextHolder에서 Authentication 객체의 principal을 찾아서 리턴한다. 이 애너테이션은 AuthenticationPrincipalArgumentResolver 클래스가 resolveArgument 메서드를 구현하여 작동하기 때문에 컨트롤러에서만 사용한다.
@GetMapping("/user/info")
public String userInfo(@AuthenticationPrincipal UserDetails userDetails) {
// doService
}
반응형
'Tool > Spring' 카테고리의 다른 글
[Spring boot] JUnit5 테스트 코드 작성하기 (0) | 2023.12.01 |
---|---|
[Spring, DB] @ManyToMany를 지양하는 이유 (2) | 2023.11.24 |
[Spring] Filter 간단 정리 (0) | 2023.11.20 |
[Spring] ApplicationRunner(앱 시작하고 코드 실행하기) 정리 (0) | 2023.10.31 |
[Spring Data JPA] Repository, Impl, Custom 정리 (0) | 2023.10.13 |