샐님 2023. 7. 15. 08:03
728x90
반응형

1. 로그인시 필터 추가

LoginCheckFilter,java - 인증 체크 필터

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);
            log.info("isLoginCheckPath(requestURI) ={}",isLoginCheckPath(requestURI));
            if(isLoginCheckPath(requestURI)){
               // 세션을 가지고 온다.
                HttpSession session = httpRequest.getSession(false);
                log.info("session ={}",session);
                if(session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) ==null){
                        // 로그인 정보가 없으면 로그인화면으로 리다이렉트 시킨다.
                    httpResponse.sendRedirect("/login?redirecrtURL="+requestURI); // 로그인한 후 다시 이전의 화면을 호출하기 위해
                    return; // 미인증 사용자는 다음으로 진행하지 않는다. 서블릿 호출하지않음
                }
            }
            log.info("모든 유저 접근가능 화면");
            chain.doFilter(request,response);


        }catch(Exception e){
            throw e; // 예외 로깅 가능하지만 톰캣까지 예외 보내야함 // 더 알아보기

        }finally {
            log.info("인증 체크 필터 종료 {}",requestURI);
        }
    }

    /**
     * 화이트 리스트의 경우 인증 체크X
     */
    private boolean isLoginCheckPath(String requestURI) {
        return !PatternMatchUtils.simpleMatch(whitelist, requestURI);
    }

}

WebConfig- loginCheckFilter() 추가

package hello.login.web;

import hello.login.web.filter.LogFilter;
import hello.login.web.filter.LoginCheckFilter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
@Slf4j
@Configuration
public class WebConfig {

    @Bean
    public FilterRegistrationBean loginCheckFilter() {
        FilterRegistrationBean<Filter> filterRegistrationBean = new
                FilterRegistrationBean<>();
        filterRegistrationBean.setFilter(new LoginCheckFilter());
        filterRegistrationBean.setOrder(2);
        filterRegistrationBean.addUrlPatterns("/*");
        return filterRegistrationBean;
    }

}

LoginController.java - 로그인 성공시 이전의 url 을 호출

    @PostMapping("/login")
    public String loginV4(@Validated @ModelAttribute LoginForm form, BindingResult
            bindingResult, HttpServletRequest request, @RequestParam(value = "redirecrtURL",defaultValue = "/")String redirectUrl) {
        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);
        log.info("redirectUrl ={}",redirectUrl);
        return "redirect:"+redirectUrl;
    }
728x90
반응형