기존 비밀번호와 신규 비밀번호를 입력받아 DB의 비밀번호를 수정하는 기능을 구현했다.
UserAccountController.java
@PatchMapping("/api/user/password")
public ApiResponse<?> modifyUserPassword(@RequestHeader("Authorization") String accessToken,
@RequestBody ModifyUserPasswordRequest modifyUserPasswordRequest) {
userAccountService.modifyUserPassword(accessToken, modifyUserPasswordRequest);
return ApiResponse.createSuccessWithNoContent(ResponseCode.USER_MODIFY_PASSWORD_SUCCESS);
}
UserAccountService.java
public void modifyUserPassword(String accessToken, ModifyUserPasswordRequest modifyUserPasswordRequest) {
jwtService.extractClaimFromJWT(JwtService.CLAIM_EMAIL, accessToken)
.ifPresentOrElse(email -> {
userAccountRepository.findByEmail(email)
.ifPresentOrElse(user -> {
if (passwordEncoder.matches(modifyUserPasswordRequest.getOldPassword(), user.getPassword())) {
user.setPassword(modifyUserPasswordRequest.getNewPassword());
user.passwordEncode(passwordEncoder);
userAccountRepository.save(user);
} else {
throw new BadRequestException(ResponseCode.USER_MODIFY_PASSWORD_FAILURE);
}
}, () -> { throw new BadRequestException(ResponseCode.USER_NOT_FOUND); });
}, () -> { throw new BadRequestException(ResponseCode.USER_NOT_FOUND); });
}
먼저 JWT의 액세스 토큰을 통해 이메일을 추출하고, 이메일을 통해 유저 엔티티를 받는다. 이 때 PasswordEncoder.encode()를 통해 암호화된 기존 비밀번호가 DB에 저장되며 해시 처리되었기 때문에 equals() 메소드를 통해서는 비교할 수 없다. 대신 PasswordEncoder 클래스에서 제공하는 mathces() 메소드를 사용할 수 있다.
첫 번째 인자값으로 평문의 String을 입력받으며, 두 번째 인자로 DB에 저장된 비밀번호를 받는다.
boolean matches(CharSequence rawPassword, String encodedPassword)
if (passwordEncoder.matches(modifyUserPasswordRequest.getOldPassword(), user.getPassword())) {
// 일치함. 비밀번호 변경 로직 수행
} else {
// 입력된 기존 비밀번호와 DB의 비밀번호가 다르므로 예외처리
}
'Spring' 카테고리의 다른 글
회원 탈퇴 시 HTTP status code (0) | 2023.05.19 |
---|---|
[Spring JPA] JPQL like 사용법 (0) | 2022.10.18 |
[Spring] @RequestParam Annotation (0) | 2022.10.18 |