Login 클래스 만들기

@Data
@AllArgsConstructor
public class Login {
	private String email;
	private String password;
	private String error;  //오류 메시지 
}

error : 오류메세지를 저장하는 문자열

 

 

 

[ LoginService ]

@Service
public class LoginService{

	@Autowired
	private UserMapper userMapper;
	
    //로그인 인증하는 메소드 : 실패할 경우 login 객체에 에러메세지 입력
    public void authenticate(Login login) {
        // 이메일로 검색해 유저 찾기
        User user = userMapper.seletByEmail(login.getEmail);

        if (user == null) {
            login.setError("이메일이 존재하지 않습니다.");
        } else {
            if (!user.getPassword().equals(login.getPassword)) {
                login.setError("패스워드가 틀립니다.");
            } else {
                login.setError(null);   //에러 없음 ( 인증됨 )
            }
        }		
    }
	
    //유저 찾기 메소드 : 이메일로 유저찾기
    public User findUserByEmail(String email) {
        User user = userMapper.selectByEmail(email);
        return user;
    }

}

 

1. 로그인 인증하는 메소드

2. 이메일로 유저 찾는 메소드

 

 

 

[  LoginController ]

가입하기 만들때 userController에 get매핑("/login") 추가안하고

loginController 를 따로 만드는 이유는.. '로그인/가입하기' 를 보기 쉽게 구별하기 위함?

@Controller
public class LoginController {
	
	@Autowired
	private LoginService loginService;
	
	@GetMapping("/login")
	public String getLoginView(@ModelAttribute Login login) {
		return "login";
	}

}

 

로그인 뷰페이지에  login 객체를 바인딩하기

→ form 태그에 th:object="${login}"

 

 

 

 

[ login.html ]

<div class="card-body">
<p class="text-primary" th:if="${message}" th:text="${message}"></p>
<form role="form" class="text-start" th:action="@{/login}" method="post" th:object="${login}">
<div class="input-group input-group-outline my-3">
  <label class="form-label">Email</label>
  <input type="email" class="form-control" th:field="*{email}" required />
</div>
<div class="input-group input-group-outline mb-3">
  <label class="form-label">Password</label>
  <input type="password" class="form-control" minlength="4" maxlength="10" />
</div>
<div class="form-check form-switch d-flex align-items-center mb-3">
  <input class="form-check-input" type="checkbox" id="rememberMe" />
  <label class="form-check-label mb-0 ms-2" for="rememberMe">Remember me</label>
</div>
<div class="text-center">
  <button type="submit" class="btn bg-gradient-primary w-100 my-4 mb-2">로그인</button>
</div>
<p class="mt-4 text-sm text-center">
  Don't have an account?
  <a th:href="@{/register}" class="text-primary text-gradient font-weight-bold">가입하기</a>
</p>
</form>

 

메세지가 있으면 메세지를 표시한다.
<p class="text-primary" th:if="${message}" th:text="${message}"></p>
login 객체가 바인딩한다
<form role="form" class="text-start" th:action="@{/login}" method="post" th:object="${login}">

 

 

※ button type="submit"  해줘야 넘어간다. ( 쉬운데 놓치기 쉬운 것! )

 

 

 

[  LoginController ]

@PostMapping("/login")
public String postLogin(Login login, Model model, HttpSession session) {
    loginService.authenticate(login);
    if (login.getError() != null) {
        model.addAttribute("message", login.getError());
        return "login";
    } else {
        User user = loginService.findUserByEmail(login.getEmail());
        session.setAttribute("user", user);
        return "redirect:/board/list";
    }
}

 

HttpSession session 

: 인증이 됐을 때 세션에 유저를 저장한다. 

 

loginService.authenticate(login); 인증 메소드 실행 (이메일,패스워드. 실패시 에러메세지) 

 

 

if 인증실패 시 로그인 페이지로,

else 인증성공 시 이메일로 유저를 찾아서 세션에 인증된 유저를 저장하고 게시판 리스트로

 

 

 

 

@GetMapping("/logout")
public String getLogout(HttpSession session, RedirectAttributes attr) {
    session.invalidate(); //모든 세션 삭제
    //session.removeAttribute("user"); 유저만 삭제
    attr.addFlashAttribute("message", "로그아웃 됨");
    return "redirect:/login"; //로그인 페이지로
}

 

 

반응형
LIST

+ Recent posts