문제
로그인을 했을경우, 이미 인증을 받았기에 필터와 인터셉트가 걸러주지 못하는 문제 발견
/members/test -> /members/admin (이동 가능)
문제의 코드
- session의 null 체크만 하고, 로그인 계정에 대한 인증 로직이 추가되지 않음
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
Pattern pattern = Pattern.compile("/members/([^/]+)");
Matcher matcher = pattern.matcher(requestURI);
log.info("인증 체크 인터셉트 실행 {}", requestURI);
HttpSession session = request.getSession(false);
if(session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
log.info("미인증 사용자 요청");
response.sendRedirect("/members/login?redirectURI=" + requestURI);
return false;
}
return true;
}
수정된 코드
- account 계정을 url에서 파싱한 후에, session에 저장되어있는 아이디와 매칭
- 주의할점)
- url 매칭을 두번째 섹션에 계정명을 사용해야한다
- ex) memebers/[계정명]
- 만약에 다른 url로 설정할경우, 인터셉트에 의해서 로그인화면으로 돌아가는 이슈가 존재할 수 있다 (* 이부분은 차후에 생각..)
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
Pattern pattern = Pattern.compile("/members/([^/]+)");
Matcher matcher = pattern.matcher(requestURI);
log.info("인증 체크 인터셉트 실행 {}", requestURI);
HttpSession session = request.getSession(false);
if(session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
log.info("미인증 사용자 요청");
response.sendRedirect("/members/login?redirectURI=" + requestURI);
return false;
}else if(matcher.find()){
String account = matcher.group(1);
Member authAccount = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER);
if (authAccount.getLoginId() == null || !authAccount.getLoginId().equals(account)){
response.sendRedirect("/members/login?redirectURI="+requestURI);
log.info("Session loginId: {}, URL account: {}", authAccount.getLoginId(), account);
return false;
}
}else{
response.sendRedirect("/errors/custom/404");
log.info("Not matcher loginId, Error 404!");
return false;
}
return true;
}