반응형

회원 상태 구현

 

Member.java

  • userStatus 추가

 

 

 

MemberCode.java

  • MEMBER_STATUS 추가

 

 

 

Member.java

public class Member implements MemberCode {

    /* 이용가능상태, 정지상태 */
    private String userStatus;
}

 

 

 

MemberCode.java

package com.zerobase.fastlms.member.entity;

public interface MemberCode {

    /* 현재 가입요청 상태 */
    String MEMBER_STATUS_REQ = "REQ";

    /* 현재 이용중인 상태 */
    String MEMBER_STATUS_ING = "ING";

    /* 현재 정지된 상태 */
    String MEMBER_STATUS_STOP = "STOP";
}

 

 

 

MemberServiceImpl.java

  • 회원가입 시 가입승인대기 상태로 지정
    /* 회원 가입 */
    @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;
    }

 

 

 

MemberServiceImpl.java

  • 이메일(계정) 인증이 완료되면 계정 활성화 상태로 변경
@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;
}

 

 

 

MemberServiceImpl.java

  • 계정 상태에 따른 로그인 에러 메시지 세분화
@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);
}

 

 

 

MemberStopUserException.java

  • 계정이용정지 상태의 계정에서 발생되는 예외처리 부분

 

 

 

  • 신규 회원 가입 테스트

 

 

 

Member DB

  • REQ(가입승인대기) 상태 확인

 

 

 

  • REQ(가입승인대기) 상태로 로그인 시도
  • '계정 활성화 이후 로그인 해주세요' 메시지 노출

 

 

 

  • 이메일을 통한 계정 활성화

 

 

 

  • 계정 활성화 페이지 새 창에 노출

 

 

 

Member DB

  • 이메일을 통한 계정 활성화하였으므로 상태 변경
  • ING(정상이용상태) 진입

 

 

 

  • ING(정상이용상태) 진입
  • 정상 로그인 가능

 

 


관리자 페이지 - 회원 상태 관리 기능 구현

 

  • 관리자 페이지에서 신규 가입한 계정을 검색

 

 

 

  • 상세정보 페이지 확인

 

 

 

detail.html

  • 회원 상태 선택 메뉴 추가

 

 

 

  • 회원 상태 선택 메뉴 추가 확인

 

 

 

detail.html

  • 현재 상태가 나타나도록 구현

 

 

 

  • 현재 상태 추가된 모습

 

 

 

detail.html

  • 상태 변경 버튼 추가

 

 

 

  • 상태 변경 버튼 추가 확인

 

 

 

detail.html

  • 입력값을 받아오는 부분 추가

 

 

 

  • 웹페이지에서 해당 부분 HTML 소스보기를 통한 확인

 

 

 

AdminMemberController.java

  • 회원 상태에 대한 매핑

 

 

 

MemberStatusInput.java

  • 입력받아올 변수 선언

 

 

 

AdminMemberController.java

@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();
}

 

 

 

MemberService.java

public interface MemberService extends UserDetailsService {

    /* 회원 상태 변경 */
    boolean updateStatus(String userId, String userStatus);

 

 

 

MemberServiceImpl.java

@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;
}

 

 

 

  • 이용정지상태로 상태 변경

 

 

 

  • 현재상태가 이용정지상태로 변경된 모습

 

 

 

  • 이용정지상태의 계정의 로그인
  • 로그인 에러 메시지 노출

 


비밀번호 초기화 기능 구현

 

detail.html

  • 회원 정보 상세 페이지에 비밀번호 초기화 입력란과 버튼 추가
<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>

 

 

 

  • 웹페이지에서 비밀번호 초기화 입력란과 버튼 추가 확인

 

 

 

MemberInput.java

  • 기존의 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();
}

 

 

 

MemberService.java

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);
}

 

 

 

MemberServiceImpl.java

@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;
}

 

 

 

  • 비밀번호 초기화 수행

 

 

 

  • 변경된 비밀번호로 로그인

 

 

  • 정상 로그인 되는 것을 확인

 


반응형

+ Recent posts