[Spring Security] There is no PasswordEncoder mapped for the id “null”
스프링 시큐리티 적용 시 사용자가 입력한 비밀번호를 암호화하지 않은 상태로 DB에 저장하면 안된다.
때문에 스프링 시큐리티 설정 코드에 암호화 기능을 스프링 빈으로 등록해 입력받은 비밀번호를 암호화해서 저장하도록 해야한다.
There is no PasswordEncoder mapped for the id “null”
위 에러는 암호화 기능인 PasswordEncoder
가 등록되지 않았거나 입력받은 비밀번호를 암호화하지 않는 경우 발생한다.
다음과 같이 스프링 시큐리티 설정 파일에 스프링 빈으로 등록해주면 다른 경로에서도 주입받아 편리하게 사용할 수 있다.
public class SecurityConfig {
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {...}
//암호화 기능
@Bean
public static BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
...
}
BCryptPasswordEncoder
는PasswordEncoder
을 상속받은 클래스로 스프링 시큐리티 설정에 등록해서 사용할 수 있음- 스프링 빈(
@Bean
)으로 등록했으므로 다른 경로에서 편리하게 사용할 수 있음- 아래 코드 참고
- 아래 코드 참고
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
private final BCryptPasswordEncoder passwordEncoder;
@Transactional
public void save(UserDto userDto) {
User user = new User(userDto, passwordEncoder.encode(userDto.getPassword()));
userRepository.save(user);
}
...
}
passwordEncoder
를private final
로 선언 후@RequiredArgsConstructor
를 통해 주입받고 사용BCryptPasswordEncoder.encode(String password)
호출을 통해 암호화된 비밀번호 반환
DB에 저장한 비밀번호를 입력받은 비밀번호와 비교할 때 BCryptPasswordEncoder.encode()
를 사용하면 같은 평문임에도
다른 값이돼 검증할 수 없다. 따라서 비밀번호 검증 시에는 BCryptPasswordEncoder.matches()
를 사용하고, 입력받은
비밀번호(평문)과 (DB에 저장돼있던) 암호화된 비밀번호를 순서대로 넣어준 뒤 호출해 검증하면 된다.
댓글남기기