paramMap,
+ HttpSession session) throws Exception {
+
+ String redirectUrl = "/index.do";
+
+ log.debug("oauthLoginCallback: service={}", oauthService);
+ log.debug("===>>> code = "+ code);
+
+ OAuthVO oauthVO = null;
+ if (StringUtils.equals(OAuthConfig.GOOGLE_SERVICE_NAME, oauthService))
+ oauthVO = googleAuthVO;
+ else if (StringUtils.equals(OAuthConfig.NAVER_SERVICE_NAME, oauthService))
+ oauthVO = naverAuthVO;
+ else if (StringUtils.equals(OAuthConfig.KAKAO_SERVICE_NAME, oauthService))
+ oauthVO = kakaoAuthVO;
+ else {
+ throw new Exception("SNS 연동 콜백정보가 올바르지 않습니다.");
+ }
+
+ String deptJsessionId = paramMap.get("deptJsessionId");
+
+ // 1. code를 이용해서 Access Token 받기
+ // 2. Access Token을 이용해서 사용자 제공정보 가져오기
+ OAuthLogin oauthLogin = new OAuthLogin(oauthVO, deptJsessionId);
+
+ OAuthUniversalUser oauthUser = oauthLogin.getUserProfile(code); // 1,2번 동시
+ log.debug("Profile ===>>" + oauthUser);
+
+ String loginResult = loginService.loginOauth(req, oauthUser.getUid(), deptJsessionId);
+
+ // oAuth를 통한 SNS연동이 실패한 경우
+ if(oauthUser == null || !oauthUser.isValid()) {
+ model.addAttribute("message", "먼저 회원가입하신 후, 이용하여 주시기 바랍니다.");
+ redirectUrl = NlibProperty.getString("member.new.url"); // "/member/insertMemberInfoForm.do"
+ }
+ // 정상 SNS 연동 로그인
+ else if(oauthUser.isValid() && loginResult == null) {
+ // 세션에 설정된 redirect 주소 확인
+ model.addAttribute("message", "정상적으로 로그인되었습니다.");
+ String deptHomeUrl = (String)session.getAttribute("deptHomeUrl");
+ redirectUrl = deptHomeUrl + "/login/loginDeptSSO.do";
+ }
+ // SNS 로그인은 정상적이나, NLIB 시스템에 등록되지 않은 사용자 : 회원가입으로 전환
+ else {
+ model.addAttribute("code", "GONEW");
+ model.addAttribute("message", "먼저 회원가입하신 후, 이용 가능합니다. 해당 SNS 계정 정보로 회원가입을 진행하시겠습니까?");
+ redirectUrl = loginResult;
+ }
+
+ return "redirect:" + redirectUrl;
+ }
+
/**
* 로그인을 처리한다. (스프링 시큐리티 로그인 수행)
*
@@ -357,6 +530,70 @@ public class LoginController {
return "redirect:" + redirectUrl;
}
+
+ @RequestMapping("/login/loginDept.do")
+ public String loginDept(
+ HttpServletRequest req,
+ HttpServletResponse res,
+ HttpSession session,
+ @RequestParam(required = false) String returnUrl,
+ ModelMap model) throws Exception {
+
+ String url = req.getRequestURL().toString();
+ String deptHomeUrl = url.replaceAll(req.getRequestURI(), "") + req.getContextPath();
+ String deptReturnUrl = deptHomeUrl + (StringUtil.isEmpty(returnUrl) ? "/" : returnUrl);
+ String deptHostName = StringUtil.getHostName(url);
+
+ session.setAttribute("deptHostName", deptHostName);
+ session.setAttribute("deptReturnUrl", deptReturnUrl);
+ session.setAttribute("deptHomeUrl", deptHomeUrl);
+
+ log.debug("REQ URL = " + url);
+ log.debug("deptJsessionId = " + session.getId());
+ log.debug("deptHostName = " + deptHostName);
+ log.debug("deptReturnUrl = " + deptReturnUrl);
+ log.debug("deptHomeUrl = " + deptHomeUrl);
+
+ String params = "deptJsessionId=" + session.getId() +
+ "&deptHostName=" + deptHostName +
+ "&deptHomeUrl=" + StringUtil.encodeBase64(deptHomeUrl) +
+ "&deptReturnUrl=" + StringUtil.encodeBase64(deptReturnUrl);
+
+ return "redirect:" + NlibProperty.getString("nculture.login.redirect.url") + "?" + params;
+ }
+
+ @RequestMapping("/login/loginDeptSSO.do")
+ public String loginDeptSSO(
+ HttpServletRequest req,
+ HttpServletResponse res,
+ HttpSession session,
+ ModelMap model) throws Exception {
+
+ String redirectUrl = "/index.do";
+
+ String snsUserId = SessionConfig.getLoginInfo(session.getId());
+ String loginResult = loginService.loginDeptSSO(req, snsUserId);
+
+ // oAuth를 통한 SNS연동이 실패한 경우
+ if(loginResult == null) {
+ // 세션에 설정된 redirect 주소 확인
+ String deptReturnUrl = (String)session.getAttribute("deptReturnUrl");
+
+ log.debug("loginDeptSSO > deptReturnUrl = " + deptReturnUrl);
+ if(StringUtil.isNotEmpty(deptReturnUrl)) {
+ redirectUrl = deptReturnUrl;
+ }
+ }
+ // SNS 로그인은 정상적이나, NLIB 시스템에 등록되지 않은 사용자 : 회원가입으로 전환
+ else {
+ model.addAttribute("code", "GONEW");
+ model.addAttribute("message", "먼저 회원가입하신 후, 이용 가능합니다. 해당 SNS 계정 정보로 회원가입을 진행하시겠습니까?");
+ redirectUrl = loginResult;
+ }
+
+ return "redirect:" + redirectUrl;
+
+ }
/**
* 로그아웃 후의 처리를 담당한다. 스프링 시큐리티에서 로그아웃이 수행된 후, 호출된다.
diff --git a/src/main/java/nlib/util/StringUtil.java b/src/main/java/nlib/util/StringUtil.java
index eaf66979..493f07cd 100644
--- a/src/main/java/nlib/util/StringUtil.java
+++ b/src/main/java/nlib/util/StringUtil.java
@@ -1,13 +1,19 @@
package nlib.util;
+import java.net.URL;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.util.Locale;
import egovframework.com.utl.fcc.service.EgovStringUtil;
+import nlib.user.web.LoginController;
/**
*
@@ -32,7 +38,9 @@ import egovframework.com.utl.fcc.service.EgovStringUtil;
*
*/
public class StringUtil extends EgovStringUtil {
-
+
+ private static final Logger log = LoggerFactory.getLogger(StringUtil.class);
+
/**
* Null 이거나, 빈문자열(공백 포함)인 경우, true를 리턴한다.
*
@@ -137,4 +145,31 @@ public class StringUtil extends EgovStringUtil {
Decoder decoder = Base64.getDecoder();
return new String(decoder.decode(str.getBytes()));
}
+
+ /**
+ * URL 주소에서 호스트명을 리턴한다.
+ *
+ * 프로토콜://호스트.도메인/URI 에서 호스트명 리턴
+ * (ex) https://seoul.nculture.org/abc/def.do -> seoul 을 리턴한다.
+ *
+ * @param url
+ * @return
+ * @throws Exception
+ */
+ public static String getHostName(String url) {
+ if(isEmpty(url)) return "";
+
+ String hostName = "";
+
+ try {
+ final URL urlObj = new URL(url);
+ hostName = urlObj.getHost();
+ if(isEmpty(hostName)) return "";
+ } catch(Exception e) {
+ log.error("[ERROR] getHostName(..) : " + e.toString());
+ return "";
+ }
+
+ return (hostName.split("\\."))[0];
+ }
}
diff --git a/src/main/resources/egovframework/mapper/config/mapper-config.xml b/src/main/resources/egovframework/mapper/config/mapper-config.xml
index 17568b6e..03e9d61a 100644
--- a/src/main/resources/egovframework/mapper/config/mapper-config.xml
+++ b/src/main/resources/egovframework/mapper/config/mapper-config.xml
@@ -12,7 +12,9 @@
-
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/egovframework/mapper/nlib/user/LoginDAO_SQL.xml b/src/main/resources/egovframework/mapper/nlib/user/LoginDAO_SQL.xml
new file mode 100644
index 00000000..5b325e2a
--- /dev/null
+++ b/src/main/resources/egovframework/mapper/nlib/user/LoginDAO_SQL.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+ INSERT INTO SM_ACC_LOG /* 접속로그 */
+ ( USER_ID
+ ,USER_NM
+ ,DEPT_SEQ
+ ,DEPT_NM
+ ,ACC_IP
+ ,LOGIN_SUCS_YN
+ ,ACC_DATE
+ ) VALUES (
+ #{userId}
+ ,#{userNm}
+ ,#{deptSeq}
+ ,#{deptNm}
+ ,#{accIp}
+ ,'Y'
+ ,NOW()
+ )
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/egovframework/mapper/nlib/user/SecUserDAO_SQL.xml b/src/main/resources/egovframework/mapper/nlib/user/SecUserDAO_SQL.xml
new file mode 100644
index 00000000..81163423
--- /dev/null
+++ b/src/main/resources/egovframework/mapper/nlib/user/SecUserDAO_SQL.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/nlib/nlib.properties b/src/main/resources/nlib/nlib.properties
index cb6038af..12ca478f 100644
--- a/src/main/resources/nlib/nlib.properties
+++ b/src/main/resources/nlib/nlib.properties
@@ -98,3 +98,20 @@ oauth2.client.provider.naver.user-name-attribute = response
# \uc190\ub2d8\uc815\ubcf4
#----------------------------------------
guest.userid = GUEST
+#----------------------------------------
+# \ub85c\uadf8\uc778/\ud68c\uc6d0\uac00\uc785\uad00\ub828 URL \uc815\ubcf4
+#----------------------------------------
+member.new.url = /member/insertMemberInfoForm.do
+member.login.url = /member/insertMemberInfoForm.do
+# \uc9c0\ubc29\ubb38\ud654\uc6d0\uc5d0\uc11c \uc811\uc18d\uc2dc \ub9ac\ub2e4\uc774\ub809\ud2b8\ub420 URL \uc815\ubcf4
+nculture.login.redirect.url = http://nlib.nculture.org/nlib/login/loginForm.do
+
+#----------------------------------------
+# \uc0ac\uc6a9\uc790\uad8c\ud55c\uba85
+#----------------------------------------
+# \uc77c\ubc18\uc0ac\uc6a9\uc790
+auth.role.user = ROLE_USER
+# \uad00\ub9ac\uc790
+auth.role.admin = ROLE_ADMIN
+# \uc2dc\uc2a4\ud15c\uad00\ub9ac\uc790
+auth.role.system = ROLE_SYSTEM
diff --git a/src/main/webapp/WEB-INF/jsp/nlib/login/loginForm.jsp b/src/main/webapp/WEB-INF/jsp/nlib/login/loginForm.jsp
index 6790ee2e..8281b9e7 100644
--- a/src/main/webapp/WEB-INF/jsp/nlib/login/loginForm.jsp
+++ b/src/main/webapp/WEB-INF/jsp/nlib/login/loginForm.jsp
@@ -49,6 +49,13 @@
+
+error : ${error }
+
+message : ${message }
+
+
+
@@ -60,5 +67,10 @@
+-------------------
+" />
+_______________
+
+