SSO 연계 서비스는 독립된 사이트간의 인증 공유를 위해 3rd party SSO 솔루션을 활용할 수 있는 인터페이스를 제공한다.
3rd party SSO 솔루션을 활용하여 인증 서비스를 구축할 때 SSO 에이전트와 표준프레임워크 인증 시스템간의 인터페이스를 정의한다. 3rd party SSO 솔루션은 인터페이스 구현을 통해 표준프레임워크에서 인증 공유를 위한 SSO에이전트 기능을 사용할 수 있게 해준다.
SSO 연게 서비스는 요소기술의 공통(cmm) 패키지와 일반 로그인 패키지(uat.uia)에 대해서만 직접적인 함수적 참조 관계를 가지며 일반 로그인 패키지(uat.uia)에 포함되어 배포된다.
유형 | 대상소스명 | 비고 |
---|---|---|
Service | egovframework.com.uat.uia.sso.service.EgovSSOService.java | SSO연계 서비스 인터페이스를 정의하는 클래스 |
Filter | egovframework.com.uat.uia.sso.filter.EgovSSOLoginFilter.java | SSO서버와 연계를 통해 SSO 인증을 실행하는 필터 클래스 |
Filter | egovframework.com.uat.uia.sso.filter.EgovSSOLogoutFilter.java | 로그아웃 요청시 SSO서버의 글로벌 로그아웃을 처리해 주는 필터 클래스 |
/** * SSO 통합 인증 서버에 인증여부를 확인 하는 메서드 * */ public boolean hasTokenInSSOServer(ServletRequest request, ServletResponse response) { SSORspData rspData = ssoService.ssoGetLoginData((HttpServletRequest)request); String uid = rspData.getUID(); if(uid == null || uid.equals("")){ return false; }else{ return true; } }
/** * SSO 통합 인증 서버에 인증 토큰 생성을 요청하는 메서드 * */ public void requestIssueToken(ServletRequest request, ServletResponse response) throws Exception { String serverIp = ""; String userIp = ""; String rtrURL = ""; String clientPort = ""; serverIp = InetAddress.getLocalHost().getHostAddress(); userIp = EgovClntInfo.getClntIP((HttpServletRequest)request); clientPort = ":" + request.getServerPort(); rtrURL = ((HttpServletRequest)request).getRequestURI(); LoginVO loginVO = (LoginVO)((HttpServletRequest)request).getSession().getAttribute("loginVO"); ssoService.ssoReqIssueToken((HttpServletRequest)request, // 서블릿 요청 객체 (HttpServletResponse)response, // 서블릿 응답 객체 "form-based", // 인증 방법 loginVO.getUniqId(), // 유니크아이디 loginVO.getUserSe(), // 아이디 식별정보 "", // SSN "http://" + serverIp + clientPort + rtrURL, // return url userIp, // client ip serverIp); // agent ip }
/** * SSO 통합 인증 서버에 인증이 된 경우 인증 서버의 토큰을 활용하여 로컬 로그인을 처리하는 메서드 * */ public void ssoLoginByServer(ServletRequest request, ServletResponse response) throws Exception { SSORspData rspData = ssoService.ssoGetLoginData((HttpServletRequest)request); LoginVO loginVO = new LoginVO(); loginVO.setUniqId(rspData.getUID()); loginVO.setUserSe(rspData.getCN()); //로컬 로그인 작성 loginVO = loginService.actionLoginByEsntlId(loginVO); //((HttpServletRequest)request).getSession().setAttribute("uid", rspData.getUID()); //스프링 시큐리티 로그인 ((HttpServletResponse)response).sendRedirect("/j_spring_security_check?j_username=" + loginVO.getUserSe() + loginVO.getId() + "&j_password=" + loginVO.getUniqId()); //((HttpServletRequest)request).getRequestDispatcher("/j_spring_security_check?j_username=" + loginVO.getUserSe() + loginVO.getId() + "&j_password=" + loginVO.getUniqId()).forward(request, response); }
/** * 토큰 정보를 바탕으로 loginVO 객체를 생성하는 메서드 * */ public LoginVO getLoginVO(ServletRequest request, ServletResponse response){ SSORspData rspData = ssoService.ssoGetLoginData((HttpServletRequest)request); LoginVO loginVO = new LoginVO(); loginVO.setUniqId(rspData.getUID()); loginVO.setUserSe(rspData.getCN()); return loginVO; }
/** * SSO 인증 정보를 삭제하는 Global Logout을 처리한다. * returnURL : Global Logout후 돌아가는 URL주소 * @throws IOException * */ public void ssoLogout(ServletRequest request, ServletResponse response, String returnURL) throws IOException{ ((HttpServletResponse)response).sendRedirect("/exam/sso/globalLogout.do?returnURL=" + returnURL); }