diff --git a/src/main/java/egovframework/com/ext/oauth/service/OAuthLogin.java b/src/main/java/egovframework/com/ext/oauth/service/OAuthLogin.java index 401eb050..f3230882 100644 --- a/src/main/java/egovframework/com/ext/oauth/service/OAuthLogin.java +++ b/src/main/java/egovframework/com/ext/oauth/service/OAuthLogin.java @@ -35,36 +35,42 @@ import nlib.util.StringUtil; public class OAuthLogin { + + /** SNS 호출 시, URL callType 대체 문자열 */ + public static final String CALL_TYPE_LOGIN = "login"; + public static final String CALL_TYPE_MEMBER = "member"; + private OAuth20Service oauthService; private OAuthVO oauthVO; - public OAuthLogin(OAuthVO oauthVO) { - ScopeBuilder scope=new ScopeBuilder(); - scope.withScope("profile"); - scope.withScope("openid"); - scope.withScope("email"); - scope.withScope("https://www.googleapis.com/auth/user.phonenumbers.read"); - scope.withScope("https://www.googleapis.com/auth/user.birthday.read"); + public OAuthLogin(OAuthVO oauthVO, String callType) { if(oauthVO.getService().equals("google")) { + ScopeBuilder scope = new ScopeBuilder(); + scope.withScope("profile"); + scope.withScope("openid"); + scope.withScope("email"); + scope.withScope("https://www.googleapis.com/auth/user.phonenumbers.read"); + scope.withScope("https://www.googleapis.com/auth/user.birthday.read"); + this.oauthService = new ServiceBuilder(oauthVO.getClientId()) .apiSecret(oauthVO.getClientSecret()) - .callback(oauthVO.getRedirectUrl()) + .callback(oauthVO.getRedirectUrl(callType)) .defaultScope(scope) //.scope("profile") .build(oauthVO.getApi20Instance()); - }else if(oauthVO.getService().equals("kakao") || oauthVO.getService().equals("naver")) - { + + } else if(oauthVO.getService().equals("kakao") || oauthVO.getService().equals("naver")) { + this.oauthService = new ServiceBuilder(oauthVO.getClientId()) .apiSecret(oauthVO.getClientSecret()) - .callback(oauthVO.getRedirectUrl()) + .callback(oauthVO.getRedirectUrl(callType)) //.scope("profile") .build(oauthVO.getApi20Instance()); } - this.oauthVO = oauthVO; } @@ -90,10 +96,10 @@ public class OAuthLogin { ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.readTree(body); - //------------------------------------ - // 네이버 (2021.08.19 KKN) - //------------------------------------ if (this.oauthVO.isNaver()) { + //------------------------------------ + // 네이버 (2021.08.19 KKN) + //------------------------------------ user.setSnsType(OAuthConfig.NAVER_SERVICE_NAME); JsonNode resNode = rootNode.get("response"); @@ -135,10 +141,10 @@ public class OAuthLogin { user.setValidLogin(true); } - //------------------------------------ - // 구글 - //------------------------------------ else if (this.oauthVO.isGoogle()) { + //------------------------------------ + // 구글 + //------------------------------------ user.setSnsType(OAuthConfig.GOOGLE_SERVICE_NAME); if (rootNode.has("sub")) user.setSnsId(StringUtil.getString(rootNode.get("sub").asText(), "")); @@ -148,10 +154,10 @@ public class OAuthLogin { } - //------------------------------------ - // 카카오 - //------------------------------------ else if (this.oauthVO.isKakao()) { + //------------------------------------ + // 카카오 + //------------------------------------ user.setSnsType(OAuthConfig.KAKAO_SERVICE_NAME); JsonNode resNode = rootNode.get("kakao_account"); @@ -170,7 +176,6 @@ public class OAuthLogin { if (resNode.has("phone_number")) user.setSnsMobileNo(StringUtil.getString(resNode.get("phone_number").asText(), "")); - } return user; diff --git a/src/main/java/egovframework/com/ext/oauth/service/OAuthVO.java b/src/main/java/egovframework/com/ext/oauth/service/OAuthVO.java index 8dd173ba..70fcb82f 100644 --- a/src/main/java/egovframework/com/ext/oauth/service/OAuthVO.java +++ b/src/main/java/egovframework/com/ext/oauth/service/OAuthVO.java @@ -30,8 +30,10 @@ public class OAuthVO implements OAuthConfig { this.clientSecret = clientSecret; } - public String getRedirectUrl() { - return redirectUrl; + public String getRedirectUrl(String callType) { + String retUrl = redirectUrl.replaceAll("\\{callType\\}", callType); + retUrl = retUrl.replaceAll("\\{oauthServiceName\\}", getService()); + return retUrl; } public void setRedirectUrl(String redirectUrl) { diff --git a/src/main/java/nlib/cmm/interceptor/NlibInterceptor.java b/src/main/java/nlib/cmm/interceptor/NlibInterceptor.java index cf68a43c..f9582ca7 100644 --- a/src/main/java/nlib/cmm/interceptor/NlibInterceptor.java +++ b/src/main/java/nlib/cmm/interceptor/NlibInterceptor.java @@ -51,19 +51,19 @@ public class NlibInterceptor extends HandlerInterceptorAdapter { // 지방문화원 접속 정보를 세션에 담기 //--------------------------------------- HttpSession session = request.getSession(); - String curCouncilCd = (String)session.getAttribute("curCouncilCd"); - if(StringUtil.isEmpty(curCouncilCd)) { + log.debug("preHandle > sessionid=" + session.getId()); + String councilCd = (String)session.getAttribute("councilCd"); + if(StringUtil.isEmpty(councilCd)) { // 지방문화원 코드 확인 - String curCouncilDnsHost = StringUtil.getHostName(request.getRequestURL().toString()); - HashMap councilInfoMap = loginService.selectCouncilInfoByDnsHost(curCouncilDnsHost); - curCouncilCd = councilInfoMap.get("councilCd"); - if(StringUtil.equals(NlibProperty.getString(""), curCouncilCd)) { - + String councilDnsHost = StringUtil.getHostName(request.getRequestURL().toString()); + HashMap councilInfoMap = loginService.selectCouncilInfoByDnsHost(councilDnsHost); + councilCd = councilInfoMap.get("councilCd"); + if(!StringUtil.equalsIgnoreCase(NlibProperty.getString("nlib.council.cd"), councilCd)) { + session.setAttribute("councilCd" , councilCd); + session.setAttribute("councilNm" , councilInfoMap.get("councilNm")); + session.setAttribute("councilDnsHost", councilDnsHost); } - session.setAttribute("curCouncilCd" , curCouncilCd); - session.setAttribute("curCouncilNm" , councilInfoMap.get("councilNm")); - session.setAttribute("curCouncilDnsHost", curCouncilDnsHost); } return true; diff --git a/src/main/java/nlib/cmm/session/SessionConfig.java b/src/main/java/nlib/cmm/session/SessionConfig.java index 5a5b7760..ab959a07 100644 --- a/src/main/java/nlib/cmm/session/SessionConfig.java +++ b/src/main/java/nlib/cmm/session/SessionConfig.java @@ -44,7 +44,7 @@ public class SessionConfig implements HttpSessionListener { private static final String DELIMITER = "\t"; /* 세션별 로그인 처리 가능한 정보 목록 */ - private static final Map loginSessions = new ConcurrentHashMap<>(); + private static final Map loginSessions = new ConcurrentHashMap<>(); /* 세션별 회원가입 처리 가능한 정보 목록 */ private static final Map memberSessions = new ConcurrentHashMap<>(); @@ -73,9 +73,9 @@ public class SessionConfig implements HttpSessionListener { * @param snsType * @param snsId */ - public static void setLoginInfo(String sessionId, String snsType, String snsId) { - log.debug("setLoginInfo : " + sessionId + ", " + snsType + ", " + snsId); - loginSessions.put(sessionId, StringUtil.getString(snsType, "NONE") + DELIMITER + StringUtil.getString(snsId, "NONE")); + public static void setLoginInfo(String sessionId, OAuthUniversalUser oUser) { + log.debug("setLoginInfo : " + sessionId + ", " + oUser.getSnsType() + ", " + oUser.getSnsId()); + loginSessions.put(sessionId, oUser); } /** @@ -87,16 +87,13 @@ public class SessionConfig implements HttpSessionListener { * @param sessionId * @return */ - public static String[] getLoginInfo(String sessionId) { + public static OAuthUniversalUser popLoginInfo(String sessionId) { if(StringUtil.isEmpty(sessionId)) return null; - String loginInfo = loginSessions.get(sessionId); - if(StringUtil.isEmpty(loginInfo)) return null; + OAuthUniversalUser ret = loginSessions.get(sessionId); - String ret[] = loginInfo.split(DELIMITER); - - log.debug("setLoginInfo : " + sessionId + ", " + ret[0] + ", " + ret[1]); + removeLoginInfo(sessionId); return ret; } @@ -134,9 +131,13 @@ public class SessionConfig implements HttpSessionListener { * @param sessionId * @return */ - public static OAuthUniversalUser getNewMemberInfo(String sessionId) { + public static OAuthUniversalUser popNewMemberInfo(String sessionId) { if(StringUtil.isEmpty(sessionId)) return null; - return memberSessions.get(sessionId); + + OAuthUniversalUser ret = memberSessions.get(sessionId); + removeNewMemberInfo(sessionId); + + return ret; } /** diff --git a/src/main/java/nlib/cmm/web/MainController.java b/src/main/java/nlib/cmm/web/MainController.java index bed13b9c..8c29639d 100644 --- a/src/main/java/nlib/cmm/web/MainController.java +++ b/src/main/java/nlib/cmm/web/MainController.java @@ -1,8 +1,14 @@ package nlib.cmm.web; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.core.Authentication; +import org.springframework.security.web.savedrequest.HttpSessionRequestCache; +import org.springframework.security.web.savedrequest.RequestCache; +import org.springframework.security.web.savedrequest.SavedRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; @@ -35,8 +41,16 @@ public class MainController { private static final Logger log = LoggerFactory.getLogger(MainController.class); @RequestMapping( {"/index.do"} ) - public String setContent(Authentication authentication, ModelMap model) { + public String setContent( + HttpServletRequest req, + HttpServletResponse res, + Authentication authentication, + ModelMap model) { + // 캐쉬된 Reqeust 히스토리 삭제 + RequestCache cache = new HttpSessionRequestCache(); + cache.removeRequest(req, res); + log.debug((authentication == null ? "손님 메인 접속" : authentication.getName() + " 메인 접속")); return "nlib/cmm/home"; } diff --git a/src/main/java/nlib/user/service/LoginService.java b/src/main/java/nlib/user/service/LoginService.java index 3216f238..9e87c6e3 100644 --- a/src/main/java/nlib/user/service/LoginService.java +++ b/src/main/java/nlib/user/service/LoginService.java @@ -5,10 +5,7 @@ import java.util.HashMap; import javax.servlet.http.HttpServletRequest; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.DisabledException; -import org.springframework.security.authentication.LockedException; - +import egovframework.com.ext.oauth.service.OAuthUniversalUser; import nlib.restful.service.DataApiReqVO; import nlib.restful.service.DataApiResVO; @@ -28,7 +25,7 @@ public interface LoginService public String loginOauth(HttpServletRequest req, String oauthServiceName, String snsId, String joinCouncilCd, String councilJsessionId); - public String loginCouncilSSO(HttpServletRequest req, String joinCouncilCd, String councilJsessionId); + public String loginCouncilSSO(HttpServletRequest req, String councilCd, OAuthUniversalUser oUser); public DataApiResVO logout(DataApiReqVO reqVO); diff --git a/src/main/java/nlib/user/service/impl/LoginServiceImpl.java b/src/main/java/nlib/user/service/impl/LoginServiceImpl.java index e40e8fae..b5a1a625 100644 --- a/src/main/java/nlib/user/service/impl/LoginServiceImpl.java +++ b/src/main/java/nlib/user/service/impl/LoginServiceImpl.java @@ -18,6 +18,7 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import egovframework.com.ext.oauth.service.OAuthUniversalUser; import nlib.cmm.service.NlibProperty; import nlib.cmm.session.SessionConfig; import nlib.restful.service.DataApiReqVO; @@ -89,7 +90,8 @@ public class LoginServiceImpl implements LoginService } // 세션목록관리에 로그인 정상 가능 정보 추가 - SessionConfig.setLoginInfo(councilJsessionId, oauthServiceName, snsId); + // TODO + //SessionConfig.setLoginInfo(councilJsessionId, o); // 회원가입정보 존재하는 SNS 아이디임을 확인 완료 return null; @@ -102,31 +104,23 @@ public class LoginServiceImpl implements LoginService * (non-Javadoc) * @see nlib.user.service.LoginService#loginCouncilSSO(javax.servlet.http.HttpServletRequest, java.lang.String) */ - public String loginCouncilSSO(HttpServletRequest req, String joinCouncilCd, String councilJsessionId) { + public String loginCouncilSSO(HttpServletRequest req, String councilCd, OAuthUniversalUser oUser) { + + if(oUser == null) return ERR_CODE_REQ_SNSLOGIN; - // 세션에서 로그인 처리 가능 정보 가져오기 - String loginInfo[] = SessionConfig.getLoginInfo(councilJsessionId); - if(loginInfo == null || loginInfo.length < 2) return ERR_CODE_REQ_SNSLOGIN; + if(!oUser.isValid()) return ERR_CODE_REQ_SNSLOGIN; - String oauthServiceName = loginInfo[0]; - String snsId = loginInfo[1]; - - if(StringUtil.isEmpty(oauthServiceName)) - return ERR_CODE_REQ_SNSLOGIN; - if(StringUtil.isEmpty(snsId)) - return ERR_CODE_REQ_SNSLOGIN; - - // 회원DB에서 사용자 정보 조회 + // SNS 연동 사용자UID로 사용자정보 조회 NlibLoginVO nLoginParamVO = new NlibLoginVO(); - nLoginParamVO.setSnsId(snsId); - nLoginParamVO.setSnsType(oauthServiceName); - nLoginParamVO.setJoinCouncilCd(joinCouncilCd); + nLoginParamVO.setSnsId(oUser.getSnsId()); + nLoginParamVO.setSnsType(oUser.getSnsType()); + nLoginParamVO.setJoinCouncilCd(councilCd); NlibLoginVO nLoginVO = loginDAO.selectLoginUserInfo(nLoginParamVO); if(nLoginVO == null) { return ERR_CODE_REQ_MEMBERSHIP; } - + // Spring Security 로그인처리위한 token 생성하여 로그인 처리 UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(nLoginVO.getUsername(), nLoginVO.getPassword()); NlibLoginVO nlibLoginedVO = loginProcSecurity(req, token); @@ -139,7 +133,6 @@ public class LoginServiceImpl implements LoginService loginDAO.insertLoginLog(nlibLoginedVO); return null; - } /** 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 @@ - + + + diff --git a/src/main/resources/nlib/nlib.properties b/src/main/resources/nlib/nlib.properties index dea2a43b..47d8dc97 100644 --- a/src/main/resources/nlib/nlib.properties +++ b/src/main/resources/nlib/nlib.properties @@ -26,7 +26,10 @@ login.url = /login/loginCouncil.do # \ub85c\uadf8\uc778 \ubb38\uc81c \ubc1c\uc0dd \uc2dc, \ub2e4\uc2dc \ub9ac\ub2e4\uc774\ub809\ud2b8\ub420 \ub85c\uadf8\uc778\ud654\uba74 \uc8fc\uc18c login.back.url = /login/loginForm.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 +nculture.login.redirect.uri = /login/loginForm.do +nculture.login.post.login.redirect.uri = /login/loginCouncilSSO.do +nculture.login.post.member.redirect.uri = /member/insertMemberInfoForm.do +nculture.login.preset.redirect.url = http://nlib.nculture.org/nlib/login/loginPreSet.do #---------------------------------------- # NLIB \uc9c0\ubc29\ubb38\ud654\uc6d0\uc815\ubcf4 @@ -119,9 +122,6 @@ oauth2.client.provider.kakao.authorization-uri = https://kauth.kakao.com/oauth oauth2.client.provider.kakao.token-uri = https://kauth.kakao.com/oauth/token?client_id= oauth2.client.provider.kakao.user-info-uri = https://kapi.kakao.com/v2/user/me -# \ucf5c\ubc31 \uc8fc\uc18c (login,signUp) -oauth2.client.callback.login.url = https://nlib.nculture.org/nlib/login/{oauthServiceName}/callback.do -oauth2.client.callback.member.url = https://nlib.nculture.org/nlib/member/{oauthServiceName}/callback.do #---------------------------------------- # \uc190\ub2d8\uc815\ubcf4 #---------------------------------------- diff --git a/src/main/webapp/WEB-INF/tiles/inc/header.jsp b/src/main/webapp/WEB-INF/tiles/inc/header.jsp index 14a73a28..49bb0ed5 100644 --- a/src/main/webapp/WEB-INF/tiles/inc/header.jsp +++ b/src/main/webapp/WEB-INF/tiles/inc/header.jsp @@ -7,7 +7,8 @@ <% - +String councilCd = (String)session.getAttribute("councilCd"); +String councilNm = (String)session.getAttribute("councilCd"); %> ';">온라인자료대출관리 (<%=session.getAttribute("councilHomeUrl") %>) @@ -39,7 +40,7 @@ ${userName}님 (${userId}) - 손님 + 손님 __${councilCd }---