Controller에 BCryptPasswordEncoder 객체를 생성한다.
생성자 주입 방식으로 DI를 주기 위해서
private final BCryptPasswordEncoder bCrypt;으로 설정한다.
/login 로그인 요청 시
@RequestMapping("/login")
public String loginMember(Member m
, Model model
, HttpSession session) {
System.out.println("id --> " + m.getUserId());
System.out.println("pwd --> " + m.getUserPwd());
Member loginUser = mService.loginMember(m);
if (loginUser != null
&& bCrypt.matches(m.getUserPwd(), loginUser.getUserPwd())
) { // 로그인 성공
// 세션영역에 로그인 정보 저장
session.setAttribute("loginUser", loginUser);
// url 재요청 (메인페이지)
return "redirect:/";
} else { // 로그인 실패
// request영역에 에러메시지 저장
// => Model 객체 : requestScope
model.addAttribute("errorMsg", "로그인에 실패했습니다.");
// 에러페이지 응답 (포워딩)
// "/WEB-INF/views/ common/errorPage .jsp"
return "common/errorPage";
}
}
m.getUserPwd() :
데이터베이스에서 가지고온 저장된 사용자 비밀번호이다.
loginUser.getUserPwd() 사용자가 로그인할 때 입력한 비밀번호이다.
.matches() 메소드는 두 개의 인자를 받는다.
첫 번째 인자는 해시된 비밀번호 [데이터 베이스에서 가져온 비밀번호]
두 번째 인자는 사용자가 입력한 비밀번호이다.
이 메소드는 사용자가 입력한 비밀번호가 해시된 비밀번호와 일치하는지 여부를 반환한다.
회원가입 폼
@RequestMapping("/insert")
public String insertMember(Member m
, HttpSession session
, Model model) {
System.out.println(m);
// => 한글 인코딩 처리 --> web.xml 파일에 필터를 등록하여 처리
// => 숫자 타입의 데이터(나이,age)가 값이 없을 경우 400 에러 발생
// --> DB 처리 시 자동 형변환 되므로 정수형->문자열 형변환하여 처리
// => 비밀번호 값을 입력된 값 그대로(평문) 저장하는 것이 아니라
// 원래 값을 알아보기 어렵게 만든 값(암호문)으로 저장할 것임!
// * Spring-security 라이브러리 추가 (pom.xml 등록)
// * BCryptPasswordEncoder 클래스를 빈으로 등록 (xml 파일 사용)
// * 추가한 파일을 서버 구동 시 pre-loading 할 수 있도록 web.xml 파일에 설정
System.out.println("평문 --> " + m.getUserPwd());
System.out.println("암호문 --> " + bCrypt.encode(m.getUserPwd()));
m.setUserPwd( bCrypt.encode(m.getUserPwd()) );
// => Member 객체에 비밀번호 평문을 암호문으로 변경
int result = mService.insertMember(m);
if (result > 0) { // 회원가입 성공 => 성공메시지 + 메인페이지 url 재요청
session.setAttribute("alertMsg", "회원가입에 성공했습니다.");
return "redirect:/";
} else { // 회원가입 실패 => 에러메시지 + 에러페이지 포워딩
model.addAttribute("errorMsg", "회원가입에 실패했습니다.");
return "common/errorPage";
}
}
spring boot에서 BCryptPasswordEncoder 빈 등록하는 방법
@Configuration
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration public class SecurityConfig {
@Bean public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Spring boot에서
@Configuration 클래스에 BCryptPasswordEncoder 빈을 등록하는 것만으로
BCryptPasswordEncoder 생성이 가능하다 web.xml 같은 설정 파일을 사용할 필요가 없다.