오늘 프로젝트를 진행하면서 최근 비밀번호 3번을 기억한후 그 비밀번호로 바꾸려하면 변경이 불가능하게 만드는 메서드를 짜봤다.
우선 엔티티에 최근 비밀번호 3개를 담을 어레이리스트를 생성한다.
@ElementCollection
@CollectionTable(name = "previous_passwords", joinColumns = @JoinColumn(name = "users_id"))
@Column(name = "password")
private List<String> previousPasswords = new ArrayList<>();
RDB에서는 컬렉션 형태의 엔티티는 저장할 수 없다. 그렇기에 별도의 테이블을 생성해줘야 한다는것을 알려줘야하는데 그것을 해주는 어노테이션이 @ElementCollection이다. 그리고 컬렉션테이블로 previous_passwords를 생성한다는것을 알리고 참조컬럼으로 users테이블의 id를 받아온다.
그리고 서비스로 넘어
if (isPreviousPassword(user, newPassword)) {
throw new IllegalArgumentException("최근 변경한 3개의 비밀번호와 중복됩니다. 다른 비밀번호로 작성해주세요.");
}
String hashedPassword = passwordEncoder.encode(newPassword);
// 비밀번호 변경 시 이전 비밀번호를 기록하고 최대 3개까지 유지
user.getPreviousPasswords().add(hashedPassword);
if (user.getPreviousPasswords().size() > 3) {
user.getPreviousPasswords().remove(0);
}
user.setPassword(hashedPassword);
user = userRepository.save(user);
return new pwChangeResponseDto(user);
private boolean isPreviousPassword(User user, String newPassword) {
for (String prevPassword : user.getPreviousPasswords()) {
if (passwordEncoder.matches(newPassword, prevPassword)) {
return true;
}
}
return false;
}
코드의 일부분이다. if문으로 최근 비밀번호 3개와 지금 변경하려는 비밀번호를 대치후 true값을 반환하게되면 예외처리로 경고를 날린다. 없을경우 새로운 비밀번호를 암호화 한후 기존 비밀번호를 어레이리스트에 담고 사이즈가 3보다 클경우 0번째 값을 제거한다. 그리고 비밀번호를 일치시키는 메서드를 분리후 거기에 foreach문으로 비교하는데 그냥 비교할경우 암호화가 되어있기때문에 matches메서드를 통해 암호화를 푼다음 비교한후 일치할경우 true를 불일치 할 경우 false값을 반환하여 비밀번호를 변경할 수 있게 된다.
'Spring' 카테고리의 다른 글
| 스프링부트를 빌드하고 터미널로 직접 실행해보자. (0) | 2023.07.31 |
|---|---|
| 인텔리제이에서 스프링부트 JSP 연동하기 (0) | 2023.07.27 |
| OAuth2 내용 정리 (0) | 2023.07.14 |
| Thymeleaf 내용 정리 (0) | 2023.07.12 |
| JUnit, Mockito 내용정리 (0) | 2023.07.11 |