35.비밀번호 인코딩2
비밀번호 인코딩2
- web.xml
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/appServlet/servlet-context.xml
/WEB-INF/spring/appServlet/security-context.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
security-context.xml을 읽을 수 있게 경로를 설정해준다
Membercontroller
@Autowired
private BCryptPasswordEncoder pwEncoder;
의존성을 주입하기 위해 membercontroller에 어노테이션을 설정한다.
- 회원가입 메소드
@RequestMapping(value = "/client-register", method = RequestMethod.POST)
public String joinPOST(MemberVO member) throws Exception {
String rawPw =""; //인코딩 전 비밀번호
String encodePw =""; //인코딩 후 비밀번호
인코딩이 되기전 비밀번호와 인코딩 후 비밀번호를 잠시 저장 시켜주는 변수를 선언한다.
rawPw = member.getPw(); //비밀번호 데이터를 얻음
encodePw = pwEncoder.encode(rawPw);
//비밀번호를 인코딩
member.setPw(encodePw); // 인코딩한 member객체를 다시 저장한다
service.memberjoin(member);
return "redirect:/client-login";
}
member 객체로 부터 비밀번호 데이터를 얻어내서 해당 비밀 번호를 인코딩한 후 member객체에 다시 저장한다.
인코딩한 비밀번호가 담긴 member객체를 memberjoin메소드에 호출 시켜 회원가입 쿼리를 실행하게 한다.
- 로그인 메소드
이전 메소드
if (vo == null) {
// 일치하지 않는 아이디,비밀번호경우
int result = 0;
session.setAttribute("result", result);
return "redirect:/client-login";
}
// 일치하는 아이디, 비밀번호 경우 - 로그인 성공
session.setAttribute("member", vo);
System.out.println("로그인성공");
// 로그인 id 확인
System.out.println("id :" + member.getId());
// 아이디 저장
session.setAttribute("memberid", vo.getId());
return "redirect:/client-main";
}
이전의 쿼리문
<!-- 로그인하기 -->
<select id="memberLogin" resultType="com.supermm.model.MemberVO">
select id, name, mpoint, adminchk, money from member where id =
#{id,jdbcType=VARCHAR} and pw=#{pw,jdbcType=VARCHAR}
</select>
memberLogin 메소드를 사용하여 사용자가 입력한 아이디와 비밀번호가 일치하면 사용자의 데이터를 select문을 이용하여 가져오는 형태의 로그인을 설정 하였다.
인코딩이 된 후 사용자의 입력한 비밀번호와 데이터의 비밀번호가 일치하는 여부를 알 수 없기 때문에 null값이 반환된다.
따라서 데이터에서 사용자의 비밀번호를 가져와야한다.
비밀번호를 가져온 후 BcryptPasswordEncoder의 matches()메소드를 사용하여 사용자가 입력한 비밀번호와 데이터가 일치하는지 확인을 한다
MemberMapper.xml의 mapper을 변경해준다
- MemberMapper.xml
<!-- 로그인하기 -->
<select id="memberLogin" resultType="com.supermm.model.MemberVO">
select id, pw, name, mpoint, adminchk, money from member where id =
#{id}
</select>
- membercontroller.java
@RequestMapping(value = "/client-login", method = RequestMethod.POST)
public String loginPost(HttpServletRequest request, MemberVO member) throws Exception {
// 세션 초기화하기
HttpSession session = request.getSession();
String rawPw =""; //인코딩 전 비밀번호
String encodePw =""; //인코딩 후 비밀번호
// 두번쨰 변수 선언 - 값을 담을 변수
MemberVO vo = service.memberLogin(member);
session을 사용하기 위해 session 변수를 선언하고 request.getSession()으로 초기화한다.
회원가입과 마찬가지로 인코딩이 되기전 비밀번호와 인코딩 후 비밀번호를 잠시 저장 시켜주는 변수를 선언한다.
메소드를 호출시켜 쿼리문을 사용한다. 쿼리문을 사용하여 받은 결과값을 vo에 저장한다.
if (vo != null) {// 일치하는 아이디가 존재시
rawPw = member.getPw(); //비밀번호 데이터를 얻음
encodePw = vo.getPw();//데이터 베이스에 저장한 인코딩된 비밀번호
if(true == pwEncoder.matches(rawPw, encodePw)) {
vo.setPw("");
session.setAttribute("member", vo);
return "redirect:/client-main";
}else {
session.setAttribute("result", 0);
return "redirect:/client-login";
}
matches(인코딩전 비밀번호, 인코딩 후 비밀번호) 메서드가 true를 반환하는지 않는지 조건문을 작성 한다.
vo.setPw(“”):인코딩 되었더라도 비밀번호를 노출 시킬 필요가 없기때문에 session에서 VO에게 사용자의 정보를 저장하기 전에 비밀번호를 지워준다.
로그인 실패시 else구문에 실행 되어야할 코드를 작성한다.
} else {
session.setAttribute("result", 0);
return "redirect:/client-login";
}
}
아이디가 없을 시 실행 되어야할 코드 또한 작성한다.
댓글남기기