• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

@AuthenticationPrincipal 애너테이션이 User 객체만 가져오는 경우...

21.09.19 22:07 작성 조회수 219

0

안녕하세요. 강의 잘 보고 있습니다.

그런데 강의와는 다르게 제 코드에서는 이상하게 동작하는 부분이 있어서 질문 드립니다.

이 강의에서는 컨트롤러에서 @AuthenticationPrincipal 애너테이션을 통해 AccountAdapter 객체를 가져올 수 있었는데요.

제 코드 상에는 loadUserByUsername 메서드에서 AccountAdapter 객체를 반환해도 @AuthenticationPrincipal 애너테이션에서는 해당 클래스의 객체를 가져오지 못합니다. 대신 스프링 시큐리티의 User 클래스로는 잘 받네요.

public ResponseEntity<?> getEvent(Long id, @AuthenticationPrincipal User user) {...} // 이때는 User 객체 잘 가져옴

public ResponseEntity<?> getEvent(Long id, @AuthenticationPrincipal AccountAdapter accountAdapter) {...} // 그런데 이 때는 null 값임

처음에는 UserDetailsService 구현 클래스인 AccountService 클래스를 스프링이 사용하지 않아서 그런건가 싶어서 아래 사항들을 체크했습니다.

  • AccountService가 빈으로 등록되었는지 -> 맞게 등록함 (@Service)
  • AccountService 에서 loadUserByUsername 메서드가 AccountAdapter 객체를 반환하는지 -> 맞게 반환함
  • AccountAdapter가 스프링 시큐리티의 User 클래스를 상속하는지 -> 상속함
  • SecurityConfig에서 void config(AuthenticationManagerBuilder auth) 메서드를 오버라이드 해서 UserDetailsService 빈을 추가했는지 -> 추가함
  • org.springframework.security.web.bind.annotation.AuthenticationPrincipal 대신 org.springframework.security.core.annotation.AuthenticationPrincipal 애너테이션을 사용했는지 -> 사용함

제가 어떤 부분을 간과해서 문제가 해결이 안되는 걸까요?

전체 소스는 깃허브에 올렸습니다.

답변 1

답변을 작성해보세요.

1

안녕하세요. 올려주신 코드를 살펴봤습니다, 테스트 코드가 제가 작성한 코드랑 다른 것 같은데 아무래도 그 차이 떄문에 인증 방식이 달라서 UserDetailsServiceImpl 코드를 사용하지 않고 인증된 걸로 보입니다.

JL님의 프로필

JL

질문자

2021.09.22

그렇네요 테스트 코드에서만 문제가 발생하네요. 답변 정말 감사합니다. 덕분에 원인을 알게 되어서 해결할 수 있을 것 같습니다 !!