개발/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
반응형