본문 바로가기
Java/Spring

[security] getPassword() is null

by java개발자 2021. 5. 6.

[코드로 배우는 스프링부트] - 구멍가게 코딩단

 

기준

plugins {
    id 'org.springframework.boot' version '2.4.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'com.adarshr.test-logger' version '2.1.1'
    id 'java'
    id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
}

 

ClubLoginSuccesshandler로 로그인 성공후 AuthenticationSuccessHandler에서 redirect하는 부분.

ClubAuthMemberDTO authMember = (ClubAuthMemberDTO) authentication.getPrincipal();
authMember.getPassword() // null

getPassword하는 부분에서 null이 발생합니다.

google 검색을 해보고, 소스코드 디버깅을 해보니

User class 내부의 eraseCredentials 함수가 호출되어 getPassword()를 실행해도 null이 return되는 것 같습니다.

// User 클래스 내부 
@Override public void eraseCredentials() {
  this.password = null;
}

 

기본값이 true라서, 기본 spring 설정에서는 xml로 처리한다고 하는데...

<security:authentication-manager erase-credentials="false">

springboot에서는 AuthenticationManagerBuilder를 파라메터로 받는 configure 에서 세팅해줘야 한다고 하네요.

// SecurityConfig 클래스 내부
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  auth.userDetailsService(clubUserDetailsService);
  auth.eraseCredentials(false);
}

그런데, 위와 같이 하면, 임의로 만들었던 ClubUserDetailsService를 사용할 수 없어서 위와 같이 추가로 service를 주입했습니다.