j00r6 / SPYAIR-Fansite-Project

1 stars 1 forks source link

[BE] Fix : Member #04_02 토큰 발급 오류 수정 (ClassCastException) #31

Closed j00r6 closed 7 months ago

j00r6 commented 9 months ago

이슈넘버 #21 과 연결되는 내용입니다.

수정사항

오류 수정 내역

내용

로그인시 토큰발급에는 문제가 없었으나 토큰 발급시 memberId, nickName 을 토큰에 첨부하고 나서 부터 ClassCastException 이 발생하여 토큰발급에 문제가 생김

해결

기존

11ac697f0dd7a7c1d78fea4d9c32911208fbf15b

CustomUserDetailsService.class 의 반환값이 User 타입으로 되어있었고

return new User(findMember.getEmail(), findMember.getPassword(), authorities);

TokenProvider.class 에서는

CustomUserDetails userDetails = (CustomUserDetails) authentication.getPrincipal();
Long memberId = userDetails.getMemberId();
String email = userDetails.getUsername();

CustomUserDetails 객체를 활용했기 때문에 타입이 맞지 않아 발생한 ClassCastException

현재

dd02d1e18dc0acf56e8394dc133e9997af248cfb

CustomUserDetailsService.class 의 반환값 을 CustomUserDetails 타입으로 변경

CustomUserDetails(findMember);

TokenProvider.class 상에는 동일코드 사용

j00r6 commented 9 months ago

분석

원인

기존에 내가 이해한 개념에서는 UserDetails 의 구현체인 CustomUserDetails를 구현하면 자동으로 UserDetails.User 의 정보와 CustomUserDetails 의 정보가 매핑되는걸로 인지하고있었으나 일련의 과정은 인증절차를 진행할때의 과정

해결

이미 Security의 인증절차를 통과하여 DB에 저장된 데이터이기 때문에 해당 DB에서 가져온 정보는 UserDetails.UserCustomUserDetails 를 각각 다른 객체로 인식함

때문에 인증절차가 지난 후에 DB로부터 정보를 조회해서 위와 같은 방식으로 CustomUserDetails 를 활용하여 Token에 유저 정보를 추가하려면 CustomUserDetailsService.class 에서 repository 로부터 조회한 값과 토큰에서 활용하는 값의 타입을 맞춰줄 필요가 있음