개발/JAVA
[JAVA/Spring] LoginInterceptor 로그인 인터셉터
Strong_옹이
2021. 7. 2. 11:07
728x90
반응형
관리자가 로그인시 등록된 IP인지 확인 후 로그인 처리를 하기 위해 LoginInterceptor를 추가해줬다.
인터셉터란 컨트롤러에 요청하는 httpRequest, 응답하는 httpResponse를 가로채는 역할을 하여 업무로그나 관리자 페이지 접근전에 인증하는 용도로 활용할 수있다.
1. 환경설정 - spring-servlet.xml
- spring-servlet.xml에 인터셉터 추가 이미 추가된 인터셉터가 있을 경우 추가된 인터셉터 하단에 추가
- 하단의 소스는 /main/login/login.do 로 요청시 가로채 LoginInterceptor을 실행한다는 의미 (미입력시 모든요청을
가로챔)
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/main/login/login.do" />
<bean id="loginInterceptor" class="com.cmn.sys.cog.log.interceptor.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
2. 테이블 생성
--테이블생성
CREATE TABLE com_adm_acc_ip_l
(
ip_no CHARACTER VARYING(50)NOT NULL,
cntnt CHARACTER VARYING(50),
ip CHARACTER VARYING(20),
CONSTRAINT com_acc_log_l_pk PRIMARY KEY(ip_no)
);
--관리자IP등록
INSERT INTO com_adm_acc_ip_l (ip_no, cntnt, ip) VALUES ('0', '로컬', '0:0:0:0:0:0:0:1');
3. 구현 - LoginInterceptor.java
- preHandle는 컨트롤러 호출되기 전 실행
- postHandle는 컨트롤러 수행 후 실행
- afterComplete는 뷰까지 모든일이 완료되었을때 실행
- 메서드의 리턴값이 false일경우 중단되고 남은인터셉터와 건트롤러가 실행되지 않음.
public class LoginInterceptor extends HandlerInterceptorAdapter {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//관리자 로그인시 등록된 IP가 아니면 로그아웃
logger.info("=========================== LoginInterceptor preHandle START ===========================");
// System.out.println(" Request URI \t: " + request.getRequestURI());
try {
LoginVO user = (LoginVO) AuthUserHelper.getAuthenticatedUser();
//유저정보가 널이 아니면
if ( user != null ) {
//아이디로 롤 권한 조회
String authorCd = loginMngService.selectAuthorCd(user);
//관리자일 경우
if (authorCd.equals("ROLE_ADMIN")) {
String userIp = EgovClntInfo.getClntIP(request);
if (userIp != null && userIp.length() > 0 ) {
user.setIp(userIp);
//등록된 아이피인지 조회
int ipCnt = loginMngService.selectAdminIpInfo(user);
if ( ipCnt > 0 ) {
System.out.println("관리자 접속을 환영합니다.");
} else if (request.getRequestURI().equals("/main/login/actionMain.do")) {
response.setContentType("text/html");
response.setCharacterEncoding("EUC-KR");
PrintWriter writer = response.getWriter();
writer.println("<script type='text/javascript'>");
writer.println("var url = '/j_spring_security_logout';");
writer.println("alert('등록된 관리자 IP가 아닙니다.');");
writer.println("location.href = url;");
writer.println("</script>");
writer.flush();
writer.close();
//세션 제거
request.getSession().invalidate();
return true;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
logger.info("=========================== LoginInterceptor preHandle STOP ===========================");
return true;
}
@Override
public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
}
728x90
반응형