강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

bichobi님의 프로필 이미지
bichobi

작성한 질문수

스프링 기반 REST API 개발

현재 사용자 조회

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

해결된 질문

작성

·

377

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 애너테이션을 사용했는지 -> 사용함

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

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

퀴즈

이벤트 API에 인증 기능을 추가하기 위해 Account 도메인을 사용한 주된 이유가 무엇일까요?

성능 최적화를 위해서

User는 예약어라 직접 사용하기 어렵기 때문에

데이터베이스 스키마 호환성을 위해서

객체지향 설계를 더 잘 반영하기 위해서

답변 1

1

백기선님의 프로필 이미지
백기선
지식공유자

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

bichobi님의 프로필 이미지
bichobi
질문자

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

bichobi님의 프로필 이미지
bichobi

작성한 질문수

질문하기