프로그래밍/spring

principalName cannot be empty 에러

승민아 2024. 7. 24. 14:23

principalName cannot be empty 에러가 발생했다.

 

보통 UserDetails의 구현체를 만들때

getUsername에 null을 반환하면 발생하는 에러라고한다.

 

principalName에 텍스트가 없으면 발생하는 에러이다.

 

 

하지만 다음과 같이 모두 반환값을 만들어 놨다.

public class CustomUserDetails implements UserDetails, OAuth2User {
    @Override
    public String getUsername() {
        return this.loginId;
    }
    
    @Override
    public String getName() {
        return nickname;
    }
    
}

 

이 에러는 UserDetails를 사용하는 일반 회원 유저에서는 발생하지 않고

OAuth2User를 사용하는 소셜 로그인 회원 유저에서 발생했다.

 

소셜 로그인의 경우 getUsername()을 사용하지 않는다고 생각하고 다음과 같이 UserDetails, OAuth2User 구현체를 반환했다.

CustomUserDetails details = new CustomUserDetails(member.getId(), "", "", name, "", profileImgPath, user.getAttributes());

CustomUserDetails의 두번째 인자가 loginId로 getUsername 반환값인데

소셜 로그인의 경우 loginId로 로그인하는게 아니라서 빈문자열을 넣어놨다.

 

이것이 문제가 되는걸까? 생각이들어 getUsername 메소드를 사용할때 출력 로그를 찍어보기로했다.

 

UserDetails, OAuth2User 구현체 일부

@Override
public String getUsername() {
    System.out.println("CustomUserDetails.getUsername");
    System.out.println("loginId = " + loginId);
    return "test";
}

 

출력 결과

 

OAuth2User를 사용하더라도 UserDetails의 getUsername()을 사용한다...!????

그래서 빈문자열을 넣어주면 안되는 것이다.

 

getUsername에 사용할 username(두번째 인자)를 넘겨줌으로써 해결했다.

CustomUserDetails details = new CustomUserDetails(member.getId(), provider + "_" + providerId, "", name, "", profileImgPath, user.getAttributes());