728x90
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
at org.springframework.security.crypto.password.DelegatingPasswordEncoder$UnmappedIdPasswordEncoder.matches(DelegatingPasswordEncoder.java:289) ~[spring-security-crypto-5.7.5.jar:5.7.5]
at org.springframework.security.crypto.password.DelegatingPasswordEncoder.matches(DelegatingPasswordEncoder.java:237) ~[spring-security-crypto-5.7.5.jar:5.7.5]
at org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks(DaoAuthenticationProvider.java:76) ~[spring-security-core-5.7.5.jar:5.7.5]
at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:147) ~[spring-security-core-5.7.5.jar:5.7.5]
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:182) ~[spring-security-core-5.7.5.jar:5.7.5]
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:201) ~[spring-security-core-5.7.5.jar:5.7.5]
...
JWT로 로그인 기능을 구현하는 중 발생한 에러.
회원가입까지는 잘 되었는데, 로그인을 시도하면서 해당 에러가 발생했다.
원인
IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
Spring Security 5부터는 암호화 과정을 거친 후 Password를 저장한다.
해당 에러는 암호화하기 위한 Password가 Null로 전달되었기 때문에 발생한 것이다.
비밀번호를 전달한 코드를 찾아가보자.
해결
MemberDetailService를 살펴보니 MemberDetails로 회원 정보를 넘기는 과정에서 실수가 있었다.
에러를 만날 때마다 느끼는거지만 원인은 정말 사소한 곳에서 발생하는 것 같다.
@Component
@RequiredArgsConstructor
public class MemberDetailsService implements UserDetailsService {
...
// 데이터베이스에서 조회한 회원 정보를 변화하는 과정과 생성하는 과정을 캡슐화 한다.
private class MemberDeatils extends Member implements UserDetails {
MemberDeatils(Member member) {
setMemberId(getMemberId());
setEmail(getEmail());
setPassword(getPassword());
setRoles(getRoles());
}
...
member 파라미터의 값이 올바르게 전달되도록 코드를 수정했다.
@Component
@RequiredArgsConstructor
public class MemberDetailsService implements UserDetailsService {
...
// 데이터베이스에서 조회한 회원 정보를 변화하는 과정과 생성하는 과정을 캡슐화 한다.
private class MemberDeatils extends Member implements UserDetails {
MemberDeatils(Member member) {
setMemberId(member.getMemberId());
setEmail(member.getEmail());
setPassword(member.getPassword());
setRoles(member.getRoles());
}
...
728x90