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

김태건님의 프로필 이미지

작성한 질문수

스프링 시큐리티 완전 정복 [6.x 개정판]

Rest 인증 성공 / 실패 핸들러

15강 rest 인증 성공 핸들러 관련 문의

작성

·

75

0

안녕하세요. 선생님

 

학습중에 에러가 발생하여 문의드립니다.

 

인증 성공 핸들러에 onAuthenticationSuccess 메소드로 넘어 오는데 authentication.getPrincipal() 의 타입이 java.util.ImmutableCollections$List12 로 와서 AccountDto로 cast가 안되는 에러가 발생하는데 원인을 모르겠습니다. ㅠㅠ

 

에러 내용

java.lang.ClassCastException:

class java.util.ImmutableCollections$List12

cannot be cast to class

com.test.security.domain.dto.AccountDto (java.util.ImmutableCollections$List12 is in module java.base of loader 'bootstrap'; com.test.security.domain.dto.AccountDto is in unnamed module of loader 'app')

 

에러 발생한 부분

AccountDto accountDto = (AccountDto) authentication.getPrincipal();

답변 2

0

정수원님의 프로필 이미지
정수원
지식공유자

아마 Authentication 의 Principal 에 AccountDto 가 아닌 어떤 리스트 타입의 객체가 저장된 것 같습니다

확인해 보시기 바랍니다

0

안녕하세요, 인프런 AI 인턴입니다.

getPrincipal() 메소드에서 반환되는 객체 타입이 예상하신 AccountDto 타입과 다른 것 같습니다. getPrincipal()이 반환하는 객체는 인증 과정에서 설정한 Principal 객체이며, 이는 보통 UserDetails의 인스턴스 또는 Authentication 객체에 설정된 사용자 정의 타입이 될 수 있습니다. 여기서는 List 타입으로 반환되고 있는데, 이는 UserDetailsService에서 사용자 정보를 로드하는 과정에서 반환 타입을 잘못 설정했거나, 인증 객체에 예상치 못한 타입이 설정된 경우일 수 있습니다.

해결 방법으로는 먼저 UserDetailsService 구현을 확인하여 loadUserByUsername 메소드가 UserDetails를 올바르게 반환하고 있는지 확인하세요. 그리고 인증 과정에서 Authentication 객체에 principalAccountDto가 아닌 다른 객체가 설정되지 않았는지 점검해 보세요.

authentication.getPrincipal() 호출 결과를 직접 AccountDto로 캐스팅하기 전에, 실제 반환된 객체 타입을 확인하거나, instanceof를 사용하여 AccountDto 타입인지 먼저 검사하는 것도 좋은 방법입니다.

에러 상황에 따라 정확한 원인과 해결책이 달라질 수 있으니, 이러한 점검 과정을 통해 문제를 해결해 보시기 바랍니다.