====== SSO 연계 서비스 ====== ===== 개요 ===== 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서버의 글로벌 로그아웃을 처리해 주는 필터 클래스| ==== 클래스다이어그램 ==== {{:egovframework:com:v2:uat:sso_component.jpg?740|}} ==== 구현예제 ==== === 공통 컴포넌트 SSO 연계 서비스를 이용하여 국가대표포털 통합인증 시스템에 사용된 SSO 솔루션을 공통컴포넌트의 인증 시스템과 연동한 예제이며 상세 구현 예제는 아래와 같다.=== {{:egovframework:com:v2:uat:example.zip|}} * 통합 인증 서버에 인증된 토큰이 존재하는지 체크하는 메서드 구현 /** * 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 객체를 생성하는 메서드 구현 /** * 토큰 정보를 바탕으로 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); }