본문 바로가기

Server Programming/Spring Boot Full-Stack Programming

[스프링 풀스택 클론 코딩 - 계정 설정] (2-10) 패스워드 찾기

반응형

logged-in-by-email

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments.html :: head"></head>
<body class="bg-light">
    <nav th:replace="fragments.html :: main-nav"></nav>

    <div class="container">
        <div class="py-5 text-center" th:if="${error}">
            <p class="lead">데모 패스워드 찾기</p>
            <div  class="alert alert-danger" role="alert" th:text="${error}">
                로그인 할 수 없습니다.
            </div>
        </div>

        <div class="py-5 text-center" th:if="${error == null}">
            <p class="lead">데모 패스워드 찾기</p>
            <h2>이메일을 통해 임시 로그인 했습니다. <a th:href="@{/settings/password}">패스워드를 변경</a>하세요.</h2>
        </div>
    </div>
</body>
</html>

 

계정이 존재하지 않거나, 이메일 토큰이 일치하지 않은경우

<div class="py-5 text-center" th:if="${error}">
    <p class="lead">데모 패스워드 찾기</p>
    <div  class="alert alert-danger" role="alert" th:text="${error}">
        로그인 할 수 없습니다.
    </div>
</div>

 

계정이 존재하고, 이메일 토큰이 일치 할경우

<div class="py-5 text-center" th:if="${error == null}">
    <p class="lead">데모 패스워드 찾기</p>
    <h2>이메일을 통해 임시 로그인 했습니다. <a th:href="@{/settings/password}">패스워드를 변경</a>하세요.</h2>
</div>

 

AccountController의 sendEmailLoginLink 메서드와 loginByEmail메서드

//패스워드 변경을 위한 이메일 로그인
@PostMapping("/email-login")
public String sendEmailLoginLink(String email, Model model, RedirectAttributes attributes) {
    Account account = accountRepository.findByEmail(email);
    if (account == null) {
        model.addAttribute("error", "유효한 이메일 주소가 아닙니다.");
        return "account/email-login";
    }

    if (!account.canSendConfirmEmail()) {
        model.addAttribute("error", "이메일로 메일 발송은 1시간마다 한 번 사용 가능합니다.");
        return "account/email-login";
    }
    accountService.sendLoginLink(account);
    attributes.addFlashAttribute("message", "이메일 인증 메일을 발송했습니다.");
    return "redirect:/email-login";
}

//이메일을 통한 링크로 패스워드 변경
@GetMapping("/login-by-email")
public String loginByEmail(String token, String email, Model model){
    Account account=accountRepository.findByEmail(email);
    String view="account/logged-in-by-email";
    //계정이 null이거나 유효한 토큰이 아닐 경우 -> 로그인 불가
    if(account==null||!account.isValidToken(token)){
        model.addAttribute("error", "로그인할 수 없습니다.");
        return view;
    }
    //유효한 토큰일 경우 로그인 처리
    accountService.login(account);
    return view;
}

 

 

email-login

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments.html :: head"></head>
<body class="bg-light">
    <div th:replace="fragments.html :: main-nav"></div>
    <div class="container">
        <div class="py-5 text-center">
            <p class="lead">데모</p>
            <h2>임시 로그인</h2>
        </div>
        <div class="row justify-content-center">
            <div th:if="${error}" class="alert alert-danger alert-dismissible fade show mt-3" role="alert">
                <span th:text="${error}">완료</span>
                <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>

            <div th:if="${message}" class="alert alert-info alert-dismissible fade show mt-3" role="alert">
                <span th:text="${message}">완료</span>
                <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>

            <form class="needs-validation col-sm-6" action="#" th:action="@{/email-login}" method="post" novalidate>
                <div class="form-group">
                    <label for="email">가입 할 때 사용한 이메일</label>
                    <input id="email" type="email" name="email" class="form-control"
                           placeholder="your@email.com" aria-describedby="emailHelp" required>
                    <small id="emailHelp" class="form-text text-muted">
                        가입할 때 사용한 이메일을 입력하세요.
                    </small>
                    <small class="invalid-feedback">이메일을 입력하세요.</small>
                </div>

                <div class="form-group">
                    <button class="btn btn-success btn-block" type="submit"
                            aria-describedby="submitHelp">로그인 링크 보내기</button>
                    <small id="submitHelp" class="form-text text-muted">
                        데모에 처음 오신거라면 <a href="#" th:href="@{/findpassword}">계정을 먼저 만드세요.</a>
                    </small>
                </div>
            </form>
        </div>

        <div th:replace="fragments.html :: footer"></div>
    </div>
    <script th:replace="fragments.html :: form-validation"></script>
</body>
</html>

 

logged-in-by-email

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments.html :: head"></head>
<body class="bg-light">
    <nav th:replace="fragments.html :: main-nav"></nav>

    <div class="container">
        <div class="py-5 text-center" th:if="${error}">
            <p class="lead">데모 패스워드 찾기</p>
            <div  class="alert alert-danger" role="alert" th:text="${error}">
                로그인 할 수 없습니다.
            </div>
        </div>

        <div class="py-5 text-center" th:if="${error == null}">
            <p class="lead">데모 패스워드 찾기</p>
            <h2>이메일을 통해 임시 로그인 했습니다. <a th:href="@{/settings/password}">패스워드를 변경</a>하세요.</h2>
        </div>
    </div>
</body>
</html>

 

반응형