이번엔 아이디/비밀번호 찾기를 구현했다.
아이디는 간단하게 이메일로만 찾을 수 있도록 구현했고,
비밀번호는 전에 작성한 회원가입 글에서 만들어놓은 메일 , 난수 클래스를 이용해서 간단하게 구현했다.
아이디와 메일을 입력하면 임시비밀번호가 발급되도록 구현했다. (암호화 적용)
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)
[스프링]회원가입 이메일인증 구현
이번엔 회원가입 시 ,이메일 인증을 구현했다. 메일로 인증번호를 받아서 인증번호를 입력 후 인증하는 방법과 메일에서 바로 버튼을 눌러서 인증을 하는 방법을 생각했는데, 사용자가 느끼기
kimfk567.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 |
[스프링]회원가입 이메일인증 구현 (2) | 2021.09.19 |
[스프링] 자동로그인 기능 구현 - 로그인4 (0) | 2021.09.17 |