티스토리 뷰

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 프로그래밍 입문 (최범균 저) 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함