Web
Ch13. MVC 3 : 로그인 구현
tose33
2022. 7. 23. 18:26
spring/AuthInfo.java
더보기
package spring;
// 로그인 성공 후 인증 상태 정보를 세션에 보관할때 사용
public class AuthInfo
{
private Long id;
private String email;
private String name;
public AuthInfo(Long id, String email, String name)
{
this.id = id;
this.email = email;
this.name = name;
}
public Long getId() {
return id;
}
public String getEmail() {
return email;
}
public String getName() {
return name;
}
}
spring/Member.java
더보기
package spring;
import java.time.LocalDateTime;
public class Member
{
private Long id;
private String email;
private String password;
private String name;
private LocalDateTime registerDateTime;
public Member(String email, String password, String name, LocalDateTime regDateTime)
{
this.email = email;
this.password = password;
this.name = name;
this.registerDateTime = regDateTime;
}
void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return this.id;
}
public String getEmail()
{
return this.email;
}
public String getPassword()
{
return this.password;
}
public String getName()
{
return this.name;
}
public LocalDateTime getRegisterDateTime()
{
return this.registerDateTime;
}
// 비밀번호 변경
public void ChangePassword(String oldPassWord, String newPassWord)
{
if(!password.equals(oldPassWord)) // 비밀번호 맞는지 확인
throw new WrongIdPasswordException();
this.password = newPassWord; // 맞다면 새로운 비밀번호 할당
}
// 암호 일치 여부 확인
public boolean matchPassword(String password)
{
return this.password.equals(password);
}
}
암호 일치 여부 확인 matchPassword() 추가
spring/AuthService.java
더보기
package spring;
// 이메일과 비밀번호가 일치하는지 확인해서 AuthInfo 객체를 생성
public class AuthService
{
private MemberDao memberDao;
public void setMemberDao(MemberDao memberDao)
{
this.memberDao = memberDao;
}
public AuthInfo authenticate(String email, String password)
{
Member member = memberDao.selectByEmail(email);
if(member == null)
{
throw new WrongIdPasswordException();
}
if(!member.matchPassword(password))
{
throw new WrongIdPasswordException();
}
return new AuthInfo(member.getId(), member.getEmail(), member.getName());
}
}
이메일과 비밀번호가 일치하는지 확인해서 AuthInfo 객체를 생성
controller/LoginCommand.java
더보기
package controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import spring.AuthInfo;
import spring.AuthService;
import spring.WrongIdPasswordException;
// 로그인 요청 처리하는 컨트롤러 클래스
@Controller
@RequestMapping("/login")
public class LoginController
{
private AuthService authService;
public void setAuthService(AuthService authService)
{
this.authService = authService;
}
@GetMapping
public String form(LoginCommand loginCommand)
{
return "login/loginForm";
}
// 로그인 버튼 눌렀을때 처리
@PostMapping
public String submit(LoginCommand loginCommand, Errors errors,
HttpSession session)
{
// 에러 있으면 errors에 담김
new LoginCommandValidator().validate(loginCommand, errors);
if(errors.hasErrors())
{
return "login/loginForm";
}
// login 시도함
try
{
AuthInfo authInfo = authService.authenticate(
loginCommand.getEmail(), loginCommand.getPassword());
// TODO 세션에 authInfo 저장해야 함
session.setAttribute("authInfo", authInfo);
return "login/loginSuccess";
} catch(WrongIdPasswordException e)
{
errors.reject("idPasswordNotMatching"); // global error
return "login/loginForm";
}
}
}
로그인 요청 처리하는 컨트롤러 클래스
controller/LoginCommandValidator.java
더보기
package controller;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
// 폼에 입력된 값이 올바른지 검사하는 Validator
public class LoginCommandValidator implements Validator
{
@Override
public boolean supports(Class<?> clazz)
{
return LoginCommand.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors)
{
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "required");
ValidationUtils.rejectIfEmpty(errors, "password", "required");
}
}
폼에 입력된 값이 올바른지 검사하는 Validator
controller/LoginController.java
더보기
package controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import spring.AuthInfo;
import spring.AuthService;
import spring.WrongIdPasswordException;
// 로그인 요청 처리하는 컨트롤러 클래스
@Controller
@RequestMapping("/login")
public class LoginController
{
private AuthService authService;
public void setAuthService(AuthService authService)
{
this.authService = authService;
}
@GetMapping
public String form(LoginCommand loginCommand)
{
return "login/loginForm";
}
// 로그인 버튼 눌렀을때 처리
@PostMapping
public String submit(LoginCommand loginCommand, Errors errors,
HttpSession session)
{
// 에러 있으면 errors에 담김
new LoginCommandValidator().validate(loginCommand, errors);
if(errors.hasErrors())
{
return "login/loginForm";
}
// login 시도함
try
{
AuthInfo authInfo = authService.authenticate(
loginCommand.getEmail(), loginCommand.getPassword());
// TODO 세션에 authInfo 저장해야 함
session.setAttribute("authInfo", authInfo);
return "login/loginSuccess";
} catch(WrongIdPasswordException e)
{
errors.reject("idPasswordNotMatching"); // global error
return "login/loginForm";
}
}
}
로그인 요청 처리하는 컨트롤러 클래스
View
view/login/loginForm.jsp
더보기
<%@ page contentType="text/html; charset=EUC-KR" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<title><spring:message code="login.title" /></title>
</head>
<body>
<form:form modelAttribute="loginCommand">
<form:errors />
<p>
<label><spring:message code="email" />:<br>
<form:input path="email" />
<form:errors path="email" />
</label>
</p>
<p>
<label><spring:message code="password" />:<br>
<form:input path="password" />
<form:errors path="password" />
</label>
</p>
<input type="submit" value="<spring:message code="login.btn" />" />
</form:form>
</body>
</html>
로그인 페이지 폼
view/lgon/loginSuccess.jsp
더보기
<%@ page contentType="text/html; charset=EUC-KR" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<title><spring:message code="login.title" /></title>
</head>
<body>
<p>
<spring:message code="login.done" />
</p>
<p>
<a href="<c:url value='/main'/>">
[<spring:message code="go.main" />]
</a>
</p>
</body>
</html>
로그인 성공 페이지 폼
label.properties
더보기
login.title=로그인
login.btn=로그인하기
idPasswordNotMatching=아이디와 비밀번호가 일치하지 않습니다
login.done=로그인에 성공했습니다
로그인 관련 뷰에서 사용할 메시지 추가
나머지는 추가된 컨트롤러와 서비스들을 스프링 빈으로 등록.
MemberConfig와 ControllerConfig에 AuthService, LoginController 빈으로 등록.
출처 : 스프링5 프로그래밍 입문 (최범균 저)