반응형
회원 상태 구현
- userStatus 추가
- MEMBER_STATUS 추가
public class Member implements MemberCode {
/* 이용가능상태, 정지상태 */
private String userStatus;
}
package com.zerobase.fastlms.member.entity;
public interface MemberCode {
/* 현재 가입요청 상태 */
String MEMBER_STATUS_REQ = "REQ";
/* 현재 이용중인 상태 */
String MEMBER_STATUS_ING = "ING";
/* 현재 정지된 상태 */
String MEMBER_STATUS_STOP = "STOP";
}
- 회원가입 시 가입승인대기 상태로 지정
/* 회원 가입 */
@Override
public boolean register(MemberInput parameter) {
Optional<Member> optionalMember =
memberRepository.findById(parameter.getUserId());
if (optionalMember.isPresent()) {
//현재 userId에 해당하는 데이터 존재
return false;
}
String encPassword = BCrypt.hashpw(parameter.getPassword(), BCrypt.gensalt());
String uuid = UUID.randomUUID().toString();
//builder pattern
Member member = Member.builder()
.userId(parameter.getUserId())
.userName(parameter.getUserName())
.phone(parameter.getPhone())
.password(encPassword)
.regDt(LocalDateTime.now())
.emailAuthYn(false)
.emailAuthKey(uuid)
.userStatus(Member.MEMBER_STATUS_REQ)
.build();
memberRepository.save(member);
//WEEK6 ASSIGNMENT BEGIN
Optional<Member> optionalMemberAdd =
memberRepository.findByUserNameAndEmailAuthKey(parameter.getUserName(), uuid);
if (!optionalMemberAdd.isPresent()) {
throw new UsernameNotFoundException("회원 정보가 존재하지 않습니다.");
}
//WEEK6 ASSIGNMENT END
String email = parameter.getUserId();
String subject = "[fastlms] 사이트 가입을 축하드립니다.";
//WEEK6 ASSIGNMENT BEGIN
Context context = new Context();
context.setVariable("userName", parameter.getUserName());
context.setVariable("emailAuthKey", uuid);
String text = templateEngine.process("member/email_auth_mail", context);
//WEEK6 ASSIGNMENT END
mailComponents.sendMail(email, subject, text);
return true;
}
- 이메일(계정) 인증이 완료되면 계정 활성화 상태로 변경
@Override
public boolean emailAuth(String uuid) {
Optional<Member> optionalMember =
memberRepository.findByEmailAuthKey(uuid);
if (!optionalMember.isPresent()) {
return false;
}
Member member = optionalMember.get();
if (member.isEmailAuthYn()) {
return false;
}
member.setUserStatus(Member.MEMBER_STATUS_ING);
member.setEmailAuthYn(true);
member.setEmailAuthDt(LocalDateTime.now());
memberRepository.save(member);
return true;
}
- 계정 상태에 따른 로그인 에러 메시지 세분화
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Optional<Member> optionalMember = memberRepository.findById(username);
if (!optionalMember.isPresent()) {
throw new UsernameNotFoundException("회원 정보가 존재하지 않습니다.");
}
Member member = optionalMember.get();
if (Member.MEMBER_STATUS_REQ.equals(member.getUserStatus())) {
throw new MemberNotEmailAuthException("계정 활성화 이후에 로그인 해주세요.");
}
if (Member.MEMBER_STATUS_STOP.equals(member.getUserStatus())) {
throw new MemberStopUserException("정지된 회원입니다.");
}
List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_USER"));
if (member.isAdminYn()) {
grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
}
return new User(member.getUserId(), member.getPassword(), grantedAuthorities);
}
- 계정이용정지 상태의 계정에서 발생되는 예외처리 부분
- 신규 회원 가입 테스트
- REQ(가입승인대기) 상태 확인
- REQ(가입승인대기) 상태로 로그인 시도
- '계정 활성화 이후 로그인 해주세요' 메시지 노출
- 이메일을 통한 계정 활성화
- 계정 활성화 페이지 새 창에 노출
- 이메일을 통한 계정 활성화하였으므로 상태 변경
- ING(정상이용상태) 진입
- ING(정상이용상태) 진입
- 정상 로그인 가능
관리자 페이지 - 회원 상태 관리 기능 구현
- 관리자 페이지에서 신규 가입한 계정을 검색
- 상세정보 페이지 확인
- 회원 상태 선택 메뉴 추가
- 회원 상태 선택 메뉴 추가 확인
- 현재 상태가 나타나도록 구현
- 현재 상태 추가된 모습
- 상태 변경 버튼 추가
- 상태 변경 버튼 추가 확인
- 입력값을 받아오는 부분 추가
- 웹페이지에서 해당 부분 HTML 소스보기를 통한 확인
- 회원 상태에 대한 매핑
- 입력받아올 변수 선언
@PostMapping("/admin/member/status.do")
public String status(Model model, MemberInput parameter) {
boolean result = memberService.updateStatus(parameter.getUserId(), parameter.getUserStatus());
return "redirect:/admin/member/detail.do?userId=" + parameter.getUserId();
}
public interface MemberService extends UserDetailsService {
/* 회원 상태 변경 */
boolean updateStatus(String userId, String userStatus);
@Override
public boolean updateStatus(String userId, String userStatus) {
Optional<Member> optionalMember = memberRepository.findById(userId);
if (!optionalMember.isPresent()) {
throw new UsernameNotFoundException("회원 정보가 존재하지 않습니다.");
}
Member member = optionalMember.get();
member.setUserStatus(userStatus);
memberRepository.save(member);
return false;
}
- 이용정지상태로 상태 변경
- 현재상태가 이용정지상태로 변경된 모습
- 이용정지상태의 계정의 로그인
- 로그인 에러 메시지 노출
비밀번호 초기화 기능 구현
- 회원 정보 상세 페이지에 비밀번호 초기화 입력란과 버튼 추가
<tr>
<th>비밀번호 초기화</th>
<td>
<div>
<form method="post" action="/admin/member/password.do">
<input th:value="${member.userId}" type="hidden" name="userId"/>
<input type="text" name="password"/>
<button type="submit">비밀번호 초기화</button>
</form>
</div>
</td>
</tr>
- 웹페이지에서 비밀번호 초기화 입력란과 버튼 추가 확인
- 기존의 MemberStatusInput.java 파일
- 클래스 이름을 수정하여 사용
package com.zerobase.fastlms.admin.model;
import lombok.Data;
@Data
public class MemberInput {
String userId;
String userStatus;
String password;
}
- 비밀번호 초기화에 대한 맵핑
@PostMapping("/admin/member/password.do")
public String password(Model model, MemberInput parameter) {
boolean result = memberService.updatePassword(parameter.getUserId(), parameter.getPassword());
return "redirect:/admin/member/detail.do?userId=" + parameter.getUserId();
}
package com.zerobase.fastlms.member.service;
import com.zerobase.fastlms.admin.dto.MemberDto;
import com.zerobase.fastlms.admin.model.MemberParam;
import com.zerobase.fastlms.member.model.MemberInput;
import com.zerobase.fastlms.member.model.ResetPasswordInput;
import org.springframework.security.core.userdetails.UserDetailsService;
import java.util.List;
public interface MemberService extends UserDetailsService {
boolean register(MemberInput parameter);
/* uuid에 해당하는 계정을 활성화 함 */
boolean emailAuth(String uuid);
/* 입력한 이메일로 비밀번호 초기화 정보를 전송 */
boolean sendResetPassword(ResetPasswordInput parameter);
/* 입력받은 uuid에 대해서 password로 초기화 함 */
boolean resetPassword(String id, String password);
/* 입력받은 uuid값이 유효한지 판단 */
boolean checkResetPassword(String uuid);
/* 회원 목록 리턴(관리자에서만 사용 가능) */
List<MemberDto> list(MemberParam parameter);
/* 회원 상세 정보 */
MemberDto detail(String userId);
/* 회원 상태 변경 */
boolean updateStatus(String userId, String userStatus);
/* 회원 비밀번호 초기화 */
boolean updatePassword(String userId, String password);
}
@Override
public boolean updatePassword(String userId, String password) {
Optional<Member> optionalMember = memberRepository.findById(userId);
if (!optionalMember.isPresent()) {
throw new UsernameNotFoundException("회원 정보가 존재하지 않습니다.");
}
Member member = optionalMember.get();
String encPassword = BCrypt.hashpw(password, BCrypt.gensalt());
member.setPassword(encPassword);
memberRepository.save(member);
return false;
}
- 비밀번호 초기화 수행
- 변경된 비밀번호로 로그인
- 정상 로그인 되는 것을 확인
반응형
'cs > java-spring-boot' 카테고리의 다른 글
[Zero-base] 7-9. 강좌 카테고리 수정, 삭제, 정렬 (0) | 2022.02.25 |
---|---|
[Zero-base] 7-8. 강좌 카테고리 목록 구현 및 추가 (0) | 2022.02.24 |
[Zero-base] 7-6. 회원 상세 목록 구현 (0) | 2022.02.24 |
[Zero-base] 7-5. 회원 목록 페이징 처리 (0) | 2022.02.24 |
[Zero-base] 7-4. 회원 검색 기능 구현 (0) | 2022.02.24 |