Skip to content

Commit

Permalink
서블릿 필터 - 인증 체크
Browse files Browse the repository at this point in the history
  • Loading branch information
kiteB committed Oct 2, 2021
1 parent 7457c52 commit 3af06db
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 1 deletion.
10 changes: 10 additions & 0 deletions login/src/main/java/hello/login/WebConfig.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package hello.login;

import hello.login.web.filter.LogFilter;
import hello.login.web.filter.LoginCheckFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand All @@ -18,4 +19,13 @@ public FilterRegistrationBean logFilter() {
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}

@Bean
public FilterRegistrationBean loginCheckFilter() {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new LoginCheckFilter());
filterRegistrationBean.setOrder(2);
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
}
57 changes: 57 additions & 0 deletions login/src/main/java/hello/login/web/filter/LoginCheckFilter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package hello.login.web.filter;

import hello.login.web.SessionConst;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.PatternMatchUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@Slf4j
public class LoginCheckFilter implements Filter {

private static final String[] whitelist = {"/", "/members/add", "/login", "/logout", "/css/*"};

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

HttpServletRequest httpRequest = (HttpServletRequest) request;
String requestURI = httpRequest.getRequestURI();

HttpServletResponse httpResponse = (HttpServletResponse) response;

try {
log.info("인증 체크 필터 시작 {}", requestURI);

if (isLoginCheckPath(requestURI)) {
log.info("인증 체크 로직 실행 {}", requestURI);
HttpSession session = httpRequest.getSession(false);
if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
log.info("미인증 사용자 요청 {}", requestURI);
//로그인으로 redirect
httpResponse.sendRedirect("/login?redirectURL=" + requestURI);

return; //미인증 사용자는 다음으로 진행하지 않고 끝!
}

}
chain.doFilter(request, response);

} catch (Exception e) {
throw e; //예외 로깅 가능하지만, 톰캣까지 예외를 보내줘야 함.
} finally {
log.info("인증 체크 필터 종료 {}", requestURI);
}

}

/**
* 화이트 리스트의 경우 인증 체크 X
*/
private boolean isLoginCheckPath(String requestURI) {
return !PatternMatchUtils.simpleMatch(whitelist, requestURI);
}
}
31 changes: 30 additions & 1 deletion login/src/main/java/hello/login/web/login/LoginController.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
Expand Down Expand Up @@ -77,7 +78,7 @@ public String loginV2(@Valid @ModelAttribute LoginForm form, BindingResult bindi
return "redirect:/";
}

@PostMapping("/login")
// @PostMapping("/login")
public String loginV3(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletRequest request) {
if (bindingResult.hasErrors()) {
return "login/loginForm";
Expand All @@ -100,6 +101,34 @@ public String loginV3(@Valid @ModelAttribute LoginForm form, BindingResult bindi
return "redirect:/";
}

/**
* 로그인 이후 redirect 처리
*/
@PostMapping("/login")
public String loginV4(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, @RequestParam(defaultValue = "/") String redirectURL, HttpServletRequest request) {
if (bindingResult.hasErrors()) {
return "login/loginForm";
}

Member loginMember = loginService.login(form.getLoginId(), form.getPassword());
log.info("login? {}", loginMember);

if (loginMember == null) {
bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다.");
return "login/loginForm";
}

//로그인 성공 처리
//세션이 있으면 있는 세션 반환, 없으면 신규 세션 생성
HttpSession session = request.getSession();

//세션에 로그인 회원 정보 보관
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
//redirectURL 적용
return "redirect:" + redirectURL;
}


// @PostMapping("/logout")
public String logout(HttpServletResponse response) {
expireCookie(response, "memberId");
Expand Down

0 comments on commit 3af06db

Please sign in to comment.