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
'Spring boot | 쇼핑몰 만들기 | 어글리 마켓 > 홈페이지 만들기 | 고객,관리자' 카테고리의 다른 글
인터셉터 Interceptor (0) | 2022.06.15 |
---|---|
인터셉터로 user 가입하기 만들기 (0) | 2022.06.15 |
Spring MVC 구조 (0) | 2022.06.15 |
[레시피] 댓글 삭제 delete (0) | 2022.06.15 |
[레시피] 댓글 수정 기능 put (0) | 2022.06.13 |