티스토리 뷰

웹 개발/SpringBoot

[Spring Boot] Password Reset(2)

스톤승현 2022. 11. 9. 23:29

오늘의 문제

String MemberController .patchRecoverPassword (EmailAuthEntity emailAuth, UserEntity user)

Enum<? extends IResult> MemberService .recoverPassword (EmailAuthEntity emailAuth, UserEntity user)

 

서비스 로직

1. 전달 받은 EmailAuthEntity 타입의 emailAuth가 가진 email, code, salt를 통해 테이블에서 새로운 EmailAuthEntity 객체를 SELECT 해온다.

2. <1>에서 SELECT한 객체가 null 이거나 isExpried() 호출 결과가 false 인 경우 FAILURE 반환. 끝.

3. <1>에서 SELECT한 객체가 가진 email 값으로 새로운 UserEntity 타입의 객체를 SELECT 해온다.

4. <3> 에서 SELECT한 UserEntity 타입의 객체에 대해 PRIMARY KEY 필드를 기준으로 나머지 열 전체에 대해 UPDATE 한다.

5. <4> 에서 수정한 UserEntity 타입의 객체에 대해 PRIMARY KEY 필드를 기준으로 나머지 열 전체에 대해 UPDATE 한다.

6. <5> 의 결과가 0이면 FAILURE, 아니면 SUCCESS를 반환. 끝.

 

- MemberController

@RequestMapping(value = "recoverPassword",
        method = RequestMethod.PATCH,
        produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String patchRecoverPassword(EmailAuthEntity emailAuth, UserEntity user) {
    Enum<?> result = this.memberService.recoverPassword(emailAuth, user);
    JSONObject responseObject = new JSONObject();
    responseObject.put("result", result.name().toLowerCase());

    return responseObject.toString();
}

- MemberMapper.xml

<update id="updateUser"
        parameterType="dev.shlee.studymemberbbs.entities.member.UserEntity">
    UPDATE `study_member`.`users`
    SET `password`          = #{password},
        `nickname`          = #{nickname},
        `name`              = #{name},
        `contact`           = #{contact},
        `address_postal`    = #{addressPostal},
        `address_primary`   = #{addressPrimary},
        `address_secondary` = #{addressSecondary},
        `registered_on`     = #{registeredOn}
    WHERE BINARY `email` = #{email}
    LIMIT 1
</update>

- IMemberMapper

int updateUser(UserEntity user);

- MemberService

    public Enum<? extends IResult> recoverPassword(EmailAuthEntity emailAuth, UserEntity user) { //user는 이메일과 패스워드만 가지고 있다. 
        EmailAuthEntity existingEmailAuth = this.memberMapper.selectEmailAuthByEmailCodeSalt(
                emailAuth.getEmail(),
                emailAuth.getCode(),
                emailAuth.getSalt());

        if (existingEmailAuth == null || !existingEmailAuth.isExpired())
        {
            return CommonResult.FAILURE;
        }

        UserEntity existingUser = this.memberMapper.selectUserByEmail(existingEmailAuth.getEmail());//existingUser가 DB에서 다 가져온값이 들어있다.
        existingUser.setPassword(CryptoUtils.hashSha512(user.getPassword()));// 새롭게 입력한 비밀번호니깐 user

        if (this.memberMapper.updateUser(existingUser) == 0) {
            return CommonResult.FAILURE;
        }
        return CommonResult.SUCCESS;
    }

- recoverPassword.js

  Cover.show('비밀번호 변경을 하고 있습니다.\n\n 잠시만 기다려 주세요.')
    const xhr = new XMLHttpRequest();
    const formData = new FormData();
    formData.append('email', form['email'].value);
    formData.append('code', form['code'].value);
    formData.append('salt', form['salt'].value);
    formData.append('password', form['password'].value);
    xhr.open('PATCH', './recoverPassword');
    xhr.onreadystatechange = () => {
        if (xhr.readyState === XMLHttpRequest.DONE) {
            Cover.hide();
            if (xhr.status >= 200 && xhr.status < 300) {
                const responseObject = JSON.parse(xhr.responseText);
                switch (responseObject['result']) {
                    case'success':
                        alert('비밀번호를 성공적으로 재설정하였습니다.\n\n확인을 누르면 로그인 페이지로 이동합니다.')
                        window.location.href = 'login';
                        break;

                    default:
                        Warning.show('비밀번호를 재설정하지 못하였습니다. 세션이 만료되었을 수도 있습니다. 잠시 후 다시 시도해주세요.')
                }
            } else {
                Warning.show('서버와 통신하지 못하였습니다. 잠시 후 다시 시도해 주세요.')
            }
        }
    };
    xhr.send(formData);
});

 

결과화면

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함