There is no PasswordEncoder mapped for the id "null" 오류

NSW2500·2023년 8월 10일

Spring Security 5.0 이전 버전의 기본 PasswordEncoder는 일반 텍스트 암호만 필요한 NoOpPasswordEncoder이다. 반면 Spring Security 5.0 이후 버전의 기본 PasswordEncoder는 DelegatingPasswordEncoder이다. 이는 아래와 같은 형식을 요구한다.

{id}encodedPassword

기존의 암호화된 비밀번호를 DelegatingPasswordEncoder에서 사용할 수 있게 하는 방법은 암호화된 비밀번호 앞에 {id}를 붙여주는 것이다.

PasswordEncoder 종류에 따른 id

1. NoOpPasswordEncoder {noop}

2. BCryptPasswordEncoder {bcrypt}

3. SCryptPasswordEncoder {scrypt}

4. Pbkdf2PasswordEncoder {pbkdf2}

5. StandardPasswordEncoder {sha256}

필자는 BCryptPasswordEncoder를 사용하므로 암호화된 비밀번호 앞에 {bcrypt}를 더해준다.

회원가입 메소드

    @Override
    public Member saveMember(Member member) {
        log.info("Saving new member {} to the database", member.getName());
        member.setPassword("{bcrypt}"+passwordEncoder.encode(member.getPassword()));

        Member saved = memberRepo.save(member);
        return saved;
    }

비밀번호 변경 메소드

    @Override
    public Member changePassword(Long id, String checkPassword, String newPassword, String newPassword2) {
        Member member = memberRepo.findById(id).orElseGet(() -> {
            throw new ResponseStatusException(HttpStatus.NOT_FOUND, "회원 정보가 존재하지 않습니다.");
        });
        //기존 비밀번호가 같은지 확인
        if (passwordEncoder.matches(checkPassword, member.getPassword().substring(8))) {
            //비밀번호 재설정
            //새로운 비밀번호 두 개가 같은지 확인
            if(newPassword.equals(newPassword2)) {
                member.setPassword("{bcrypt}"+passwordEncoder.encode(newPassword));
                memberRepo.save(member);
                return member;
            } else{
                throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "비밀번호 두 개가 다릅니다.");
            }
        } else{
            throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "비밀번호가 틀립니다.");
        }
    }

0개의 댓글