728x90
반응형
비밀번호 제약 조건 확인 API
[ MemberService.java ]
/**
* 비밀번호 제약조건 확인
*/
public boolean checkPasswordConstraint(String userPW){
Pattern pattern = Pattern.compile("^(?=.*[a-zA-Z])(?=.*\\d).{8,20}$");
return pattern.matcher(userPW).matches();
}
→ 이전에 만들었던 비밀번호 제약조건 확인하는 로직(영문 숫자 포함 8~20자리)으로 API 설계
[CheckPasswordConstraintRequest.java]
import lombok.Getter;
@Getter
public class CheckPasswordConstraintRequest {
private String password;
}
● RequestBody로 사용할 클래스 생성
[ MemberController.java ]
@PostMapping("/password/constraint")
public Response passwordConstraint(@RequestBody CheckPasswordConstraintRequest request){
boolean checkPW = memberService.checkPasswordConstraint(request.getPassword());
if(checkPW){
log.info("비밀번호 제약조건 Success Code:200 " + now.getDate()); //로그 시간
return new Response(true, HttpStatus.OK.value(), null, "비밀번호를 사용 가능합니다.");
} else {
// 302 에러
log.error("비밀번호 제약조건 Error Code:302 " + now.getDate()); //로그 시간
return new Response(false, HttpStatus.FOUND.value(), null, "비밀번호는 영문과 숫자포함 8-20자리입니다.");
}
}
비밀번호 일치 확인 API
[ CheckPasswordSameRequest.java ]
import lombok.Getter;
@Getter
public class CheckPasswordSameRequest {
private String password;
private String password_;
}
[ MemberController.java ]
@PostMapping("/password/same")
public Response passwordSame(@RequestBody CheckPasswordSameRequest request){
if(request.getPassword().equals(request.getPassword_())){
log.info("2차 비밀번호 일치 Success Code:200 " + now.getDate());
return new Response(true, HttpStatus.OK.value(), null, "2차 비밀번호가 일치합니다.");
} else {
// 302 에러
log.error("2차 비밀번호 불일치 Error Code:302 " + now.getDate());
return new Response(false, HttpStatus.FOUND.value(), null, "2차 비밀번호가 일치하지 않습니다.");
}
}
비밀번호 변경 API
[ Member.java ]
/**
* 비밀번호 변경 (변경감지)
*/
private void setUserPW(String userPW) {
this.userPW = userPW;
}
● 변경 감지를 위한 setUserPW 메서드 구현
[ MemberService.java ]
/**
* 비밀번호 변경 (변경 감지 이용)
*/
@Transactional
public UUID changePassword(String uuid, String userPW){
Member member = findUserByUUID(uuid);
if(member==null) return null; //회원 정보 없음
//비밀번호 암호화
String encodedPW = passwordEncoder.encode(userPW);
//변경 감지를 이용한 사용자 비밀번호 업데이트
member.setUserPW(encodedPW);
return member.getUuid();
}
● 변경 감지를 이용한 changePassword 메서드 구현
1. uuid를 통한 멤버를 영속성 컨택스트로 불러옵니다.
2. 불러온 멤버 객체를 setUserPW 메서드를 통해서 데이터를 변경시켜줍니다.
3. 메서드가 끝나고 영속석 컨택스트 내의 데이터 변경을 감지하여 변경 되었다면 update 쿼리를 자동으로 날려줍니다.
[ ChangePasswordRequest.java ]
import lombok.Getter;
@Getter
public class ChangePasswordRequest {
private String uuid;
private String password;
}
[ MemberController.java ]
/**
* 비밀번호 변경을 위한 기존 비밀번호 확인
*/
@PostMapping("/password/origin")
public Response checkPasswordOrigin(@RequestBody ChangePasswordRequest request){
Member member = memberService.findUserByUUID(request.getUuid());
if(member!=null){
if(member.matchPassword(passwordEncoder, request.getPassword())){
log.info("회원 인증 Success Code:200 " + now.getDate());
return new Response(true, HttpStatus.OK.value(), member.getUuid(), "회원 인증이 되었습니다.");
} else {
// 302 에러
log.error("비밀번호 불일치 Error Code:302 " + now.getDate());
return new Response(false, HttpStatus.FOUND.value(), null, "비밀번호가 일치하지 않습니다.");
}
} else {
// 301 에러
log.error("회원 정보 Error Code:301 " + now.getDate());
return new Response(false, HttpStatus.MOVED_PERMANENTLY.value(), null, "등록되지 않은 회원입니다.");
}
}
/**
* 비밀번호 변경
*/
@PutMapping("/password")
public Response changePassword(@RequestBody ChangePasswordRequest request){
boolean checkPW = memberService.checkPasswordConstraint(request.getPassword());
if(checkPW){
UUID uuid = memberService.changePassword(request.getUuid(), request.getPassword());
if(uuid!=null){
log.info("비밀번호 변경 Success Code:200 " + now.getDate());
return new Response(true, HttpStatus.OK.value(), uuid, "비밀번호가 변경되었습니다.");
} else {
// 301 에러
log.error("회원 정보 Error Code:301 " + now.getDate());
return new Response(false, HttpStatus.MOVED_PERMANENTLY.value(), null, "등록되지 않은 회원입니다.");
}
} else {
// 302 에러
log.error("비밀번호 제약조건 Error Code:302 " + now.getDate());
return new Response(false, HttpStatus.FOUND.value(), null, "비밀번호는 영문과 숫자포함 8-20자리입니다.");
}
}
728x90
반응형
'Project > Todo' 카테고리의 다른 글
[Spring Boot] Todo 서비스 구현 (1) (0) | 2022.07.17 |
---|---|
[Refactoring] 관심사 분리를 통한 DIP 지키기 (0) | 2022.07.15 |
[AWS EC2 ubuntu] MySQL 데이터베이스 구축, 스프링 배포 파일 빌드, 서버 데이터베이스를 이용한 Member API 테스트 (2) | 2022.07.12 |
[AWS EC2 ubuntu] 서버 초기 설정, MySQL 설정 (0) | 2022.07.12 |
[AWS EC2 ubuntu] WinSCP와 PuTTY를 이용해서 EC2 인스턴스 접속 (0) | 2022.07.11 |