diff --git a/src/main/java/nlib/user/web/LoginController.java b/src/main/java/nlib/user/web/LoginController.java index f343df4f..3686ac32 100644 --- a/src/main/java/nlib/user/web/LoginController.java +++ b/src/main/java/nlib/user/web/LoginController.java @@ -112,6 +112,7 @@ public class LoginController { String councilReturnUrl = councilHomeUrl + (StringUtil.isEmpty(returnUrl) ? "/" : returnUrl); String councilDnsHost = StringUtil.getHostName(url); + // 캐쉬된 요청URL인 존재하는 경우, 리턴URL로 설정 RequestCache cache = new HttpSessionRequestCache(); SavedRequest savedRequest = cache.getRequest(req, res); if (savedRequest != null) { @@ -119,27 +120,19 @@ public class LoginController { log.debug("loginCouncil > HttpSessionRequestCache에서 획득 councilReturnUrl = " + councilReturnUrl); } - // returnUrl 정보 설정 -// if(StringUtil.isEmpty(returnUrl)) { -// RequestCache cache = new HttpSessionRequestCache(); -// SavedRequest savedRequest = cache.getRequest(req, res); -// if (savedRequest != null) { -// councilReturnUrl = savedRequest.getRedirectUrl(); -// log.debug("loginCouncil > HttpSessionRequestCache에서 획득 councilReturnUrl = " + councilReturnUrl); -// } -// } - // 지방문화원 코드 확인 HashMap councilInfo = loginService.selectCouncilInfoByDnsHost(councilDnsHost); String councilCd = (councilInfo == null ? null : councilInfo.get("councilCd")); String councilNm = (councilInfo == null ? null : councilInfo.get("councilNm")); - session.setAttribute("councilDnsHost", councilDnsHost); session.setAttribute("councilReturnUrl", councilReturnUrl); session.setAttribute("councilHomeUrl", councilHomeUrl); + + session.setAttribute("councilDnsHost", councilDnsHost); session.setAttribute("councilCd", councilCd); session.setAttribute("councilNm", councilNm); + log.debug("loginCouncil > sessionid=" + session.getId()); log.debug("loginCouncil > REQ URL = " + url); log.debug("loginCouncil > councilJsessionId = " + session.getId()); log.debug("loginCouncil > councilDnsHost = " + councilDnsHost); @@ -155,9 +148,59 @@ public class LoginController { "&councilHomeUrl=" + StringUtil.encodeBase64(councilHomeUrl) + "&councilReturnUrl=" + StringUtil.encodeBase64(councilReturnUrl); - return "redirect:" + NlibProperty.getString("nculture.login.redirect.url") + "?" + params; + return "redirect:" + NlibProperty.getString("nculture.login.preset.redirect.url") + "?" + params; } + /** + * 로그인 콜백을 위한 설정을 처리한 후, 로그인 페이지로 전환한다. + * + * @param req + * @param error + * @param logout + * @param model + * @return + */ + @RequestMapping("/login/loginPreSet.do") + public String loginPreSet(HttpServletRequest req, + @RequestParam(required = false) String error, + @RequestParam(required = false) String message, + @RequestParam(required = false) String logout, + RedirectAttributes redirectAttrs, + @RequestParam Map paramMap, + Model model, + HttpSession session) { + + //---------------------------------------------- + // 지방문화원 사이트에서 접속한 경우, 지방문화원 정보 확인 + //---------------------------------------------- + String councilJsessionId = paramMap.get("councilJsessionId"); + String councilDnsHost = paramMap.get("councilDnsHost"); + String councilReturnUrl = StringUtil.decodeBase64(paramMap.get("councilReturnUrl")); + String councilHomeUrl = StringUtil.decodeBase64(paramMap.get("councilHomeUrl")); + String councilCd = paramMap.get("councilCd"); + String councilNm = StringUtil.decodeBase64(paramMap.get("councilNm")); + + log.debug("loginPreSet > sessionid=" + session.getId()); + log.debug("loginPreSet > councilJsessionId = " + councilJsessionId); + log.debug("loginPreSet > councilDnsHost = " + councilDnsHost); + log.debug("loginPreSet > councilReturnUrl = " + councilReturnUrl); + log.debug("loginPreSet > councilHomeUrl = " + councilHomeUrl); + log.debug("loginPreSet > councilCd = " + councilCd); + log.debug("loginPreSet > councilNm = " + councilNm); + + session.setAttribute("councilJsessionId", councilJsessionId); + session.setAttribute("councilReturnUrl", councilReturnUrl); + session.setAttribute("councilHomeUrl" , councilHomeUrl); + + session.setAttribute("councilDnsHost", councilDnsHost); + session.setAttribute("councilCd" , councilCd); + session.setAttribute("councilNm" , councilNm); + + String redirect = councilHomeUrl + NlibProperty.getString("nculture.login.redirect.uri"); + return "redirect:" + redirect; + } + + /** * 로그인 정보 입력 화면을 출력한다. * @@ -180,13 +223,14 @@ public class LoginController { //---------------------------------------------- // 지방문화원 사이트에서 접속한 경우, 지방문화원 정보 확인 //---------------------------------------------- - String councilJsessionId = paramMap.get("councilJsessionId"); - String councilDnsHost = paramMap.get("councilDnsHost"); - String councilReturnUrl = StringUtil.decodeBase64(paramMap.get("councilReturnUrl")); - String councilHomeUrl = StringUtil.decodeBase64(paramMap.get("councilHomeUrl")); - String councilCd = paramMap.get("councilCd"); - String councilNm = StringUtil.decodeBase64(paramMap.get("councilNm")); + String councilJsessionId = (String)session.getAttribute("councilJsessionId"); + String councilDnsHost = (String)session.getAttribute("councilDnsHost"); + String councilReturnUrl = (String)session.getAttribute("councilReturnUrl"); + String councilHomeUrl = (String)session.getAttribute("councilHomeUrl"); + String councilCd = (String)session.getAttribute("councilCd"); + String councilNm = (String)session.getAttribute("councilNm"); + log.debug("loginForm > sessionid=" + session.getId()); log.debug("loginForm > councilJsessionId = " + councilJsessionId); log.debug("loginForm > councilDnsHost = " + councilDnsHost); log.debug("loginForm > councilReturnUrl = " + councilReturnUrl); @@ -194,25 +238,18 @@ public class LoginController { log.debug("loginForm > councilCd = " + councilCd); log.debug("loginForm > councilNm = " + councilNm); - session.setAttribute("councilJsessionId", councilJsessionId); - session.setAttribute("councilDnsHost", councilDnsHost); - session.setAttribute("councilReturnUrl", councilReturnUrl); - session.setAttribute("councilHomeUrl" , councilHomeUrl); - session.setAttribute("councilCd" , councilCd); - session.setAttribute("councilNm" , councilNm); - //---------------------------------------------- // SNS 연동 URL 생성 //---------------------------------------------- - OAuthLogin naverLogin = new OAuthLogin(naverAuthVO); + OAuthLogin naverLogin = new OAuthLogin(naverAuthVO, OAuthLogin.CALL_TYPE_LOGIN); log.debug("naverLogin.getOAuthURL() = "+naverLogin.getOAuthURL()); model.addAttribute("naverUrl", naverLogin.getOAuthURL()); - OAuthLogin googleLogin = new OAuthLogin(googleAuthVO); + OAuthLogin googleLogin = new OAuthLogin(googleAuthVO, OAuthLogin.CALL_TYPE_LOGIN); log.debug("googleLogin.getOAuthURL() = "+googleLogin.getOAuthURL()); model.addAttribute("googleUrl", googleLogin.getOAuthURL()); - OAuthLogin kakaoLogin = new OAuthLogin(kakaoAuthVO); + OAuthLogin kakaoLogin = new OAuthLogin(kakaoAuthVO, OAuthLogin.CALL_TYPE_LOGIN); log.debug("kakaoLogin.getOAuthURL() = "+kakaoLogin.getOAuthURL()); model.addAttribute("kakaoUrl", kakaoLogin.getOAuthURL()); @@ -235,14 +272,18 @@ public class LoginController { * @return * @throws Exception */ - @RequestMapping(value = {"/login/{oauthServiceName}Callback.do", "/login/{oauthServiceName}/callback.do"}) + @RequestMapping(value = {"/{callType}/{oauthServiceName}/callback.do"}) // /login/{oauthServiceName}/callback.do, /member/{oauthServiceName}/callback.do public String loginOauthCallback( HttpServletRequest req, + @PathVariable String callType, @PathVariable String oauthServiceName, @RequestParam(required = false) String code, Model model, HttpSession session) throws Exception { + + log.debug("loginOauthCallback > sessionid=" + session.getId()); + String redirectUrl = NlibProperty.getString("home.uri"); // "/index.do"; String councilJsessionId = (String)session.getAttribute("councilJsessionId"); String councilCd = (String)session.getAttribute("councilCd"); @@ -263,11 +304,11 @@ public class LoginController { //----------------------------------------------- // 1. code를 이용해서 Access Token 받기 - // 2. Access Token을 이용해서 사용자 제공정보 가져오기 + // 2. Access Token을 이용해서 사용자 제공 정보 가져오기 //----------------------------------------------- - OAuthLogin oauthLogin = new OAuthLogin(oauthVO); + OAuthLogin oauthLogin = new OAuthLogin(oauthVO, callType); OAuthUniversalUser oauthUser = oauthLogin.getUserProfile(code); // 1,2번 동시 - log.debug("oauthLoginCallback > Profile ===>>" + oauthUser.getSnsId() + ", " + oauthUser.getName()); + log.debug("oauthLoginCallback > Profile ===>>" + oauthUser.getSnsId() + ", " + oauthUser.getSnsName()); // oAuth를 통한 SNS연동이 실패한 경우 if(oauthUser == null || !oauthUser.isValid()) { @@ -277,26 +318,17 @@ public class LoginController { } //----------------------------------------------- - // 등록된 사용자 여부 확인 + // 해당 처리기로 전환 //----------------------------------------------- - String loginResult = loginService.loginOauth(req, oauthServiceName, oauthUser.getSnsId(), councilCd, councilJsessionId); - - // 정상 SNS 연동 로그인 - if(loginResult == null) { - // 세션에 설정된 redirect 주소 확인 - String councilHomeUrl = (String)session.getAttribute("councilHomeUrl"); - redirectUrl = councilHomeUrl + "/login/loginCouncilSSO.do"; - return "redirect:" + redirectUrl; - } - - // SNS 로그인은 정상적이나, NLIB 시스템에 등록되지 않은 사용자 : 회원가입으로 전환 - model.addAttribute("error", loginResult); - if(StringUtil.equalsIgnoreCase(loginResult, loginService.ERR_CODE_REQ_MEMBERSHIP)) { - model.addAttribute("message", "회원가입하신 후, 이용 가능합니다."); - redirectUrl = NlibProperty.getString("member.new.url"); - } else if(StringUtil.equalsIgnoreCase(loginResult, loginService.ERR_CODE_REQ_SNSLOGIN)) { - model.addAttribute("message", "먼저 로그인할 SNS를 선택하여 로그인 바랍니다."); - redirectUrl = NlibProperty.getString("login.back.url"); + String councilHomeUrl = (String)session.getAttribute("councilHomeUrl"); + if(OAuthLogin.CALL_TYPE_LOGIN.equalsIgnoreCase(callType)) { + // 로그인인 경우 + SessionConfig.setLoginInfo(councilJsessionId, oauthUser); + redirectUrl = councilHomeUrl + NlibProperty.getString("nculture.login.post.login.redirect.uri"); + } else { + // 회원가입인 경우 + SessionConfig.setNewMemberInfo(councilJsessionId, oauthUser); + redirectUrl = councilHomeUrl + NlibProperty.getString("nculture.login.post.member.redirect.uri"); } return "redirect:" + redirectUrl; @@ -361,22 +393,34 @@ public class LoginController { String jsessionId = session.getId(); String councilCd = (String)session.getAttribute("councilCd"); - String loginResult = loginService.loginCouncilSSO(req, councilCd, jsessionId); + String councilReturnUrl = (String)session.getAttribute("councilReturnUrl"); + OAuthUniversalUser oauthUser = SessionConfig.popLoginInfo(jsessionId); - // oAuth를 통한 SNS연동 성공인 경우 + if(oauthUser == null || !oauthUser.isValid()) { + throw new Exception("잘못된 접근입니다."); + } + + //----------------------------------------------- + // 등록된 사용자 여부 확인 + //----------------------------------------------- + String loginResult = loginService.loginCouncilSSO(req, councilCd, oauthUser); + + // 정상 SNS 연동 로그인 if(loginResult == null) { // 세션에 설정된 redirect 주소 확인 - String councilReturnUrl = (String)session.getAttribute("councilReturnUrl"); - - log.debug("loginCouncilSSO > councilReturnUrl = " + councilReturnUrl); - if(StringUtil.isNotEmpty(councilReturnUrl)) { - redirectUrl = councilReturnUrl; - } + return "redirect:" + councilReturnUrl; } - // SNS 로그인은 정상적이나, NLIB 시스템에 등록되지 않았거나 정보가 서로 맞지 않는 경우 - else { - model.addAttribute("error", loginResult); + + // SNS 로그인은 정상적이나, NLIB 시스템에 등록되지 않은 사용자 : 회원가입으로 전환 + model.addAttribute("error", loginResult); + if(StringUtil.equalsIgnoreCase(loginResult, loginService.ERR_CODE_REQ_MEMBERSHIP)) { + model.addAttribute("message", "회원가입하신 후, 이용 가능합니다."); + redirectUrl = NlibProperty.getString("member.new.url"); + return "redirect:" + redirectUrl; + } else if(StringUtil.equalsIgnoreCase(loginResult, loginService.ERR_CODE_REQ_SNSLOGIN)) { + model.addAttribute("message", "먼저 로그인할 SNS를 선택하여 로그인 바랍니다."); redirectUrl = NlibProperty.getString("login.back.url"); + return "redirect:" + redirectUrl; } return "redirect:" + redirectUrl; diff --git a/src/main/resources/egovframework/spring/context-oauth.xml b/src/main/resources/egovframework/spring/context-oauth.xml index e681b171..d634ad51 100644 --- a/src/main/resources/egovframework/spring/context-oauth.xml +++ b/src/main/resources/egovframework/spring/context-oauth.xml @@ -8,7 +8,9 @@ - + + +