이번엔 아이디/비밀번호 찾기를 구현했다.
아이디는 간단하게 이메일로만 찾을 수 있도록 구현했고,
비밀번호는 전에 작성한 회원가입 글에서 만들어놓은 메일 , 난수 클래스를 이용해서 간단하게 구현했다.
아이디와 메일을 입력하면 임시비밀번호가 발급되도록 구현했다. (암호화 적용)
mapper.xml
<update id="findPw" >
update MP_MEMBER set MEMBER_PW = #{memberPw} where MEMBER_EMAIL = #{memberEmail} and MEMBER_ID = #{memberId}
</update>
<select id="findPwCheck" resultType="int">
select count(*) from MP_MEMBER where MEMBER_EMAIL = #{memberEmail} and MEMBER_ID = #{memberId}
</select>
일단 저번 글의 아이디찾기 유효성 검사는 동일하다.
Email과 Id를 이용해서 count하고, 맞는 값이 없으면 0이 리턴될테니 그 값을 이용해 유효성 검사를 한다.
그 후 ,
입력받은 Email과 Id로 비밀번호를 update시킨다. 비밀번호는 암호화 시킬 예정이다.
(회원가입시에 비밀번호가 암호화되서 DB에 들어가고,로그인시엔 암호화 된 비밀번호를 해독하도록
구현했기 때문에 정상적인 작동을 위해서는 필수불가결)
DAO,DAOImpl
public int findPwCheck(MemberVO memberVO)throws Exception;
public int findPw(String memberPw,String memberEmail,String memberId)throws Exception;
@Override
public int findPwCheck(MemberVO memberVO)throws Exception{
return sqlsession.selectOne("memberMapper.findPwCheck", memberVO);
}
@Override
public int findPw(String memberEmail,String memberId,String memberPw)throws Exception{
Map<String,Object> map = new HashMap<String, Object>();
map.put("memberEmail", memberEmail);
map.put("memberId", memberId);
map.put("memberPw", memberPw);
return sqlsession.update("memberMapper.findPw", map);
}
Mapper에서 parameterType=Map으로 param1 , param2 식으로 받는 방법도 있겠지만,
DAOImpl에서 Map으로 처리해서 넣어줬다.
Service,ServiceImpl
public void findPw(String memberEmail,String memberId)throws Exception;
public int findPwCheck(MemberVO memberVO)throws Exception;
@Override
public int findPwCheck(MemberVO memberVO)throws Exception{
return memberDAO.findPwCheck(memberVO);
}
@Override
public void findPw(String memberEmail,String memberId)throws Exception{
String memberKey = new TempKey().getKey(6,false);
String memberPw = BCrypt.hashpw(memberKey,BCrypt.gensalt());
memberDAO.findPw(memberEmail,memberId,memberPw);
MailUtils sendMail = new MailUtils(mailSender);
sendMail.setSubject("[ICEWATER 커뮤니티 임시 비밀번호 입니다.]"); //메일제목
sendMail.setText(
"<h1>임시비밀번호 발급</h1>" +
"<br/>"+memberId+"님 "+
"<br/>비밀번호 찾기를 통한 임시 비밀번호입니다."+
"<br/>임시비밀번호 : <h2>"+memberKey+"</h2>"+
"<br/>로그인 후 비밀번호 변경을 해주세요."+
"<a href='http://localhost:8080/member/loginView"+
">로그인 페이지</a>");
sendMail.setFrom("[보낼이메일]", "ICEWATER");
sendMail.setTo(memberEmail);
sendMail.send();
}
메일작성,난수생성에 대한 부분은 전 글에서 설명했기 때문에 생략하겠다.
[스프링]회원가입 이메일인증 구현 :: 간편 웹프로그래밍 (tistory.com)
난수생성 클래스인 TempKey를 이용해 6자리의 비밀번호를 생성하고, (memberKey)
암호화해준다.(memberPw)
이메일엔 6자리의 비밀번호를 보내주고 (memberKey)
암호화된 비밀번호는 update문을 통해 DB에 임시비밀번호를 넣어준다(memberPw)
Controller
@RequestMapping(value="/findPwView" , method=RequestMethod.GET)
public String findPwView() throws Exception{
return"/member/findPwView";
}
@RequestMapping(value="/findPw", method=RequestMethod.POST)
public String findPw(MemberVO memberVO,Model model) throws Exception{
logger.info("memberPw"+memberVO.getMemberId());
if(memberService.findPwCheck(memberVO)==0) {
logger.info("memberPWCheck");
model.addAttribute("msg", "아이디와 이메일를 확인해주세요");
return "/member/findPwView";
}else {
memberService.findPw(memberVO.getMemberEmail(),memberVO.getMemberId());
model.addAttribute("member", memberVO.getMemberEmail());
return"/member/findPw";
}
}
비밀번호 찾기 뷰와 비밀번호찾기 로직 컨트롤러이다.
유효성 검사를 통해 0이 나오면 비밀번호찾기뷰에서 팝업창을 출력,
그렇지 않으면 로직실행 후 /member/findPw 페이지로 이동
findPwView.jsp
<script type="text/javascript">
var msg = "${msg}";
if (msg != "") {
alert(msg);
}
</script>
<div class="p-5">
<div class="text-center">
<h1 class="h4 text-gray-900 mb-2">비밀번호 찾기</h1>
<p class="mb-4">아이디와 이메일을 입력해주세요!</p>
</div>
<form class="user" action="/member/findPw" method="post">
<div class="form-group">
<input type="text" class="form-control form-control-user"
id="memberId" aria-describedby="IdHelp" name="memberId"
placeholder="Enter ID....">
</div>
<div class="form-group">
<input type="email" class="form-control form-control-user"
id="memberEmail" aria-describedby="emailHelp" name="memberEmail"
placeholder="Enter Email Address...">
</div>
<button type="submit" class="btn btn-primary btn-user btn-block">
Find PW
</button>
</form>
<hr>
<a href="/member/loginView" class="btn btn-google btn-user btn-block">
Login
</a>
<hr>
<div class="text-center">
<a class="small" href="/board/list">메인페이지</a>
</div>
디자인은 빼고, 기능부분의 코드만 넣었다.
자바스크립트를 통한 팝업창, form태그를 이용한 입력, 페이지이동 버튼이다..
findPw.jsp
<div class="card o-hidden border-0 shadow-lg my-5">
<div class="jumbotron">
<h2> 임시 비밀번호가 전송되었습니다. </h2><br/>
<h1>${member}</h1><br/>
<h2>를 확인해주세요.</h2>
<button type="button" class="btn btn-primary" onclick="location.href='/member/loginView'">로그인페이지</button>
<button type="button" class="btn btn-primary" onclick="location.href='/board/list'">메인페이지</button>
</div>
결과
1장. 비밀번호찾기 뷰
2장. 비밀번호찾기 유효성검사
3장.비밀번호찾기 성공
4장.이메일확인
5장.DB에 저장된 암호화 된 비밀번호
암호화 된 비밀번호를 통한 로그인이나 회원가입은 이전글을 참고하길 바랍니다..
원래 ajax로 구현하려 했으나 너무 시간이 걸릴 것 같아 포기했다..
나중에 아예 한 페이지 전체를 ajax로 구현해서 특훈을 할 예정이다.
(추천기능을 이용한 best 게시글,댓글,사용자 등을 보여주는 페이지)
구현하면서, 좀 더 복잡하게 보안을 위해 아이디/비밀번호 찾기를 만들어볼까 생각이 났지만
사용자가 극히 드문 이번 프로젝트에서 굳이,,? 라는 생각이 들어서 어느정도 구현단계에 대한 설계정도만 생각하고,
간단하게 구현해보았다.
'SPRING > IceWater Community' 카테고리의 다른 글
[스프링] 회원정보수정 - 비밀번호 (ajax) (0) | 2021.09.24 |
---|---|
[스프링] 회원정보수정 - 닉네임,이메일 (ajax) (0) | 2021.09.24 |
[스프링] 아이디찾기 구현 (1) | 2021.09.24 |
[스프링]회원가입 이메일인증 구현 (1) | 2021.09.19 |
[스프링] 자동로그인 기능 구현 - 로그인4 (0) | 2021.09.17 |