@PostMapping("/user/pwd_change")
public ResponseEntity<Void> change_pwd(HttpServletRequest request, @Valid @RequestBody RequestChangePWD requestChangePWD){
boolean check_pwd = userService.change_pwd(requestChangePWD, (User) request.getAttribute("user"));
return (check_pwd) ?
ResponseEntity.status(HttpStatus.OK).body(null) :
ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
UserService의 change_pwd함수를 호출하고 결과에 따라 200 또는 400의 status code를 반환
@Valid 어노테이션을 사용해 유효성 검사 처리
@Override
public boolean change_pwd(RequestChangePWD requestChangePWD, User user){
if(bCryptPasswordEncoder.matches(requestChangePWD.getOrigin_password(), user.getPassword())){
user.changePWD(bCryptPasswordEncoder.encode(requestChangePWD.getNew_password()));
userRepository.save(user);
return true;
}
return false;
}
비밀번호는 BCryptPasswordEncoder 를 통해 암호화 되어있음
BCryptPasswordEncoder 는 패스워드를 해싱 할 때 내부적으로 랜덤한 솔트를 생성하므로 같은 문자열에 대해 매번 다른 해싱결과가 나옴
또한 해시 값 내부에 솔트 값이 포함되기 때문에 솔트 값을 따로 저장하지 않아도 해싱된 값과 평문을 비교할 수 있음
따라서 matches 라는 함수를 이용하지 않고 문자열 비교하면 틀림
입력한 비밀번호가 현재 비밀번호와 같다면 새로운 비밀번호로 수정