spring에서는 AuthenticationPrincipalArgumentResolver 를 제공하는데, 이를 통해 현재 인증된 Authenticaion.getPrincipal()을 자동으로 메서드의 파라미터로 받을 수 있게한다.
만일 우리가 UserDetailsService를 구현한CustomUserDetailsService가 UserDetail의 구현인 CustomUserDetails를 반환한다면, 아래의 코드로 현재 인증된 유저의 정보 가져올 수 있다.
@GetMapping("/")
public ApiResponse findArticleForUser() {
Authentication authentication =
SecurityContextHolder.getContext().getAuthentication();
CustomUserDetails customUserDetails = (CustomUserDetails) authentication == null ? null : authentication.getPrincipal();
// 나머지 로직 ...
}
위의 코드를 @AuthenticationPrincipal을 사용한다면 아래와 같이 메서드의 파라미터로 바로 받아올 수 있다.
@GetMapping("/")
public ApiResponse findArticleForUser(
@AuthenticaionPrincipal CustomUserDetails customUserDetails
) {
// 나머지 로직 ...
}
위 처럼 @AuthenticaionPrincipal을 사용하여 메서드에서 바로 받아올 수 있지만, 따로 하나의 파일을 만들어 어노테이션을 만드는 방법도 있다.
아래 코드와 같이 만든다.
@Target({ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@AuthenticationPrincipal
public @interface CurrentUser {}
이름은 CurrentUser가 아니더라도 LoginAccount, LoginUser 등등 원하는 이름으로 작성할 수 있다.
이처럼 어노테이션을 만들어놓으면, 아래와 같이 사용할 수 있다.
@GetMapping("/")
public ApiResponse findArticleForUser(
@CurrentUser CustomUserDetails customUserDetails
) {
// 나머지 로직 ...
}