반응형
회원 탈퇴 기능 구현
- 회원 정보에서 회원 탈퇴 링크 추가
- 생성된 링크 모습
- 회원 탈퇴 페이지
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title> 회원 정보 </title>
</head>
<body>
<h1>회원 탈퇴</h1>
<div th:replace="/fragments/layout.html :: fragment-body-menu"></div>
<div th:replace="/fragments/layout.html :: fragment-member-info-menu"></div>
<div>
<p>
회원 탈퇴를 하면
서비스를 더 이상 이용하실 수 없습니다.
<br/>
회원 탈퇴를 진행하시겠습니까?
</p>
<form id="submitForm" method="post">
<div>
<input type="password" name="password" placeholder="현재 비밀번호 입력" required/>
</div>
<div>
<button type="submit">회원 탈퇴 하기</button>
</div>
</form>
</div>
</body>
</html>
- 페이지 맵핑을 위한 컨트롤러
@GetMapping("/member/withdraw")
public String memberWithdraw(Model model) {
return "member/withdraw";
}
- 평문 패스워드와 암호화된 패스워드 비교 메서드
- 평문 패스워드를 암호화하는 메서드
package com.zerobase.fastlms.util;
import org.springframework.security.crypto.bcrypt.BCrypt;
public class PasswordUtils {
public static boolean equals(String plaintext, String hashed) {
if (plaintext == null || plaintext.length() < 1) {
return false;
}
if (hashed == null || hashed.length() < 1) {
return false;
}
return BCrypt.checkpw(plaintext, hashed);
}
public static String encPassword(String plaintext) {
if (plaintext == null || plaintext.length() < 1) {
return "";
}
return BCrypt.hashpw(plaintext, BCrypt.gensalt());
}
}
- 탈퇴 처리를 위한 컨트롤러
@PostMapping("/member/withdraw")
public String memberWithdrawSubmit(Model model
, MemberInput parameter
, Principal principal) {
String userId = principal.getName();
ServiceResult result = memberService.withdraw(userId, parameter.getPassword());
if (!result.isResult()) {
model.addAttribute("message", result.getMessage());
return "common/error";
}
return "redirect:/member/logout";
}
- 회원 탈퇴를 위한 서비스 인터페이스 생성
/**
* 회원 탈퇴
*/
ServiceResult withdraw(String userId, String password);
- 탈퇴한 회원에 대한 상태가 필요함
package com.zerobase.fastlms.member.entity;
public interface MemberCode {
/* 현재 가입 요청 상태 */
String MEMBER_STATUS_REQ = "REQ";
/* 현재 정상 이용 상태 */
String MEMBER_STATUS_ING = "ING";
/* 현재 정지 상태 */
String MEMBER_STATUS_STOP = "STOP";
/* 현재 탈퇴 상태 */
String MEMBER_STATUS_WITHDRAW = "WITHDRAW";
}
- Dto에서는 기본적으로 password를 받아오지 않으므로,
- password를 별도의 입력값으로 받아야함.
@Override
public ServiceResult withdraw(String userId, String password) {
Optional<Member> optionalMember = memberRepository.findById(userId);
if (!optionalMember.isPresent()) {
return new ServiceResult(false, "회원 정보가 존재하지 않습니다.");
}
Member member = optionalMember.get();
if (!PasswordUtils.equals(password, member.getPassword())) {
return new ServiceResult(false, "비밀번호가 일치하지 않습니다.");
}
member.setUserName("삭제회원");
member.setPhone("");
member.setPassword("");
member.setRegDt(null);
member.setUdtDt(null);
member.setEmailAuthYn(false);
member.setEmailAuthDt(null);
member.setEmailAuthKey("");
member.setResetPasswordKey("");
member.setResetPasswordLimitDt(null);
member.setUserStatus(MemberCode.MEMBER_STATUS_WITHDRAW);
member.setZipcode("");
member.setAddr("");
member.setAddrDetail("");
memberRepository.save(member);
return new ServiceResult();
}
- 회원 탈퇴 기능 테스트
- 비밀번호가 일치하지 않는 경우
- 비밀번호가 맞는 경우 탈퇴 처리 완료
- DB에서 리셋된 모습
반응형
'cs > java-spring-boot' 카테고리의 다른 글
[Zero-base] 8-7. 강좌 관리 - 파일 업로드 구현 (0) | 2022.03.03 |
---|---|
[Zero-base] 8-6. 강좌 관리 - 강좌별 강좌 신청 내역 구현 (0) | 2022.03.03 |
[Zero-base] 8-5. 회원 정보 수정 - REST API를 이용한 수강 강좌 취소 구현 (0) | 2022.03.02 |
[Zero-base] 8-5. 회원 정보 수정 - 다음 우편변호 API를 이용한 주소 정보 수정 구현 (0) | 2022.03.02 |
[Zero-base] 8-5. 회원 정보 수정 - 비밀번호 변경 및 회원 정보 수정 (0) | 2022.03.02 |