Spring Projcect/학습 관리 시스템 & 백오피스 구축

Chapter 08. 스프링 부트 프로젝트 - 비밀번호 찾기(초기화)

계란💕 2022. 8. 18. 16:46

  Ex) 메인 페이지에 공통적으로 계속 사용할 코드를 어떻게 관리할까?

 

     - ThymeLeaf fragment

     - layout 파일을 이렇게 구성하면 

html
열기

 

     - index 파일을 간단히 작성 가능

html
열기

 

    - 다른 info,  파일에도 모두 적용한다.

<div th:replace="/fragments/layout.html :: fragment-body-menu" ></div>

 

     - 가입 결과 페이지는 true / false에 맞게 각각 넣어줘야한다.

 

  Note) 실행 결과

 

 

 ==================================오류 =====================================

  - 로그인을 해야만 메인페이지가 안 뜬다.

  - 그리고 메인 기본 인덱스 페이지가 안 나오고 로그인 페이지가 첫 번째로 나온다.

  - 원인: SecurityConfig클래스에서 메서드 이름을 잘못 썼다.

 

 

  Ex) 비밀 번호 찾기

 

    - 로그인 페이지

    - member/find/password는 @PostMapping() 안의 매개변수 - URL 주소

html
열기

 

    - 멤버 컨트롤러

java
열기

 

    - find_password 파일 만든다.

       -> 데이터베이스의 변수명을 보고 만든다

html
열기

 

 

    - http://localhost:8080/member/find_password  입력하면  http://localhost:8080/member/login페이지로 이동한다.

      -> SecurityConfig 클래스 설정 때문이다.

      -> SecurityConfig 에 내용 추가

      (find_password 수정

java
열기

 

  Note) 실행 결과

    - ResetPasswordInput

java
열기

 

    - 비밀번호 찾기 메서드

      -> 새로운 비밀번호를 파라미터로 받는다.

      -> 주소는 그대로 뷰만 바꾸고 메인 페이지로 넘기려면? => return "index" => 

      -> 주소도 같이 바꾸고 메인 페이지로 넘기려면? =>  return "redirect:/"

      -> 인터페이스 model에 속성을 추가한다.

java
열기

 

    - 맞는지 확인하기

 

    - find_password_result.html : 비밀번호 찾기 결과 페이지

html
열기

  Note) 실행 결과

    - result 만들어줘야한다. (이메일과 이름 맞는지)

    - 이메일 보내준다.

    - 멤버서비스

java
열기

 

    - 멤버리포지토리 - 메서드 findByUserIdAndUserName() 추가

java
열기

 

    - 멤버서비스임플 - sendResetPassword()

      -> 사용자한테 메일을 보내고 나서 사용자가 링크를 타고 와서 아이디 패스워드를 입력 => 입력한 데이터로 계정 초기화

      -> 사용자만 아는 유일한 값을 보낸다.

 

    - Member 

      -> 키가 일치할 때만 비밀번호 초기화 가능하도록 한다.

private String resetPasswordKey;

 

      -> 시간 초과하면 더이상 초기화할 수 없다.

private LocalDateTime resetPasswordLimitDt;

 

     - 멤버서비스임플

       -> id는 url에 나오는 특정한 값이다.

java
열기

  Note) 실행 결과

 

 

  Ex)  회원 정보 입력해서 비밀번호 찾기

java
열기

 

    - ServiceImpl에 내용을 추가한다.

java
열기

 

    - 멤버컨트롤러

java
열기

 

    - 확인 비밀번호는 서버로 데이터를 보낼 필요 없이 클라이언트에서 맞는지 체크하면 된다. jQuery

 

  Note) 비밀 번호 찾기 => 회원 정보 일치

    - 데이터베이스에 데이터가 들어온다. 인증 날짜, 인증 키

 

    - 이메일 링크 클릭 => 비번 확인은 나중에 구현한다. jQuery

 

 

 

  Note) 비밀 번호 찾기 => 틀린 정보 입력

 

 

  Ex)  jQuery 다운로드

    - 접속 https://releases.jquery.com/

    - 압축되지 않은 minified 선택

 

 

    - copy 버튼을 누른다.

 

    - reset_password 파일에 추가

      -> 

html
열기

 

     - 비밀번호 초기화 화면에서 새로고침 누르면?

      -> 아래와 같은 알림창이 뜬다.

   

 

   

 

  Ex) 비밀번호 재설정 버튼 누르고 난 다음, 페이지 만든다.

 

    - reset_password 파일에서 버튼은 하나밖에 없다. 

    - password를 찾아서 값이 같은지 확인한다.

    - this: 현재 폼, input의 이름이 password인 값을 찾아서 저장한다.

var password = $(this).find('input[name=password]').val();

 

    -  비밀번호를 다르게 입력하고 비밀번호 재설정 버튼을 누르면?

html
열기

 

  Note) 실행 화면

 

    - 비밀번호 초기화 메서드

      -> 비밀번호 재설정 창에서 넘어온 값들을 받아서 비밀번호를 새로 지정한다.

    - ResetPasswordInput()

java
열기

 

    - 비밀번호 재설정 화면

 

    - 재설정 버튼 누른 화면

      -> 화면에 나온 값을 가지고 아이디를 초기화할 계획이다.

 

    - 멤버컨트롤러

java
열기

 

    - 멤버서비스 메서드 추가한다.

java
열기

 

    - MemberServiceImpl에 메서드 추가

java
열기

 

    - 멤버리포짓에 추가

Optional<Member> findByResetPasswordKey(String resetPasswordKey);

 

    - resetPassword() 구현

      -> 패스워드 초기화 요청할 때, 날짜가 맞아야만 초기화 가능하다.

java
열기

 

    - 멤버 컨트롤러 - resetPasswordSubmit()

java
열기

 

    - 비밀번호 초기화한 다음, 결과 나타낼 파일 reset_password_result 을 만든다. 

       -> 비밀번호 초기화 결과는 위에 컨트롤러의 resetPasswordSummit의 결과 "result"를 보고 판단한다.

html
열기

 

    - 비밀번호 초기화 결과

 

     - 초기화가 정상적으로 이뤄지면 데이터가 지워진다.

      -> 그런데 문제는 여전히 이메일에서 링크를 타고 들어올 수 있다는 것이다.

      -> 이 문제를 방지하려면?

      -> 컨트롤러의 resetPassword() 에서 uuid가 유효한지 확인해야한다.

 

      - 컨트롤러를 내용 추가

java
열기

 

    - 멤버서비스

      ->uuid를 매개변수로 넣었을 때, 적잘한 값인지 체크하기 위한 메서드 "checkResetPassword()"

/**
 * 입력받은 uuid 유효성 검사
 */
boolean checkResetPassword(String uuid);

 

    - 멤버서비스 임플 위 메서드 구현

      -> result를 그대로  컨트롤러의 model에 저장한다.

java
열기

 

java
열기

 

    - 그러고나서 비밀번호 초기화 창에서 위 변수를 이용 가능하다.

 

    - 위 데이터베이스에서 reset_password_limit_dt 값이 null 인 경우, 아래와 같은 창을 띄울 수 있다.