From b891c1df234ce89ab55e8e37de027059fc718623 Mon Sep 17 00:00:00 2001 From: JSYOO Date: Tue, 31 Aug 2021 16:25:10 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=EC=86=8C=EC=8A=A4=20=EC=B6=A9=EB=8F=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nlib/user/web/LoginController.java | 168 +++++++++++------- .../egovframework/spring/context-oauth.xml | 4 +- 2 files changed, 109 insertions(+), 63 deletions(-) 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 @@ - + + + From bfe618583189b678598ef4776ee3feacc6936526 Mon Sep 17 00:00:00 2001 From: JSYOO Date: Thu, 2 Sep 2021 10:48:30 +0900 Subject: [PATCH 2/3] =?UTF-8?q?vo=20=EC=88=98=EC=A0=95=20=EC=BB=A4?= =?UTF-8?q?=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ext/oauth/service/OAuthUniversalUser.java | 22 +++++++++++- .../java/nlib/user/service/NlibLoginVO.java | 34 +++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/main/java/egovframework/com/ext/oauth/service/OAuthUniversalUser.java b/src/main/java/egovframework/com/ext/oauth/service/OAuthUniversalUser.java index 6b046cc5..e05c339a 100644 --- a/src/main/java/egovframework/com/ext/oauth/service/OAuthUniversalUser.java +++ b/src/main/java/egovframework/com/ext/oauth/service/OAuthUniversalUser.java @@ -2,10 +2,12 @@ package egovframework.com.ext.oauth.service; import java.util.Date; +import nlib.user.service.NlibLoginVO; import nlib.util.StringUtil; public class OAuthUniversalUser { + private String mbInfoId; private String snsId; private String snsEmail; @@ -20,7 +22,9 @@ public class OAuthUniversalUser { private String snsMobileNo; private String loginIp; - private Date lastLogin; + private Date lastLogin; + + private NlibLoginVO nlibVO; private boolean isValidLogin = false; @@ -28,6 +32,14 @@ public class OAuthUniversalUser { return StringUtil.isNotEmpty(snsId); } + public String getMbInfoId() { + return mbInfoId; + } + + public void setMbInfoId(String mbInfoId) { + this.mbInfoId = mbInfoId; + } + public String getSnsId() { return snsId; } @@ -140,4 +152,12 @@ public class OAuthUniversalUser { this.snsMobileNo = snsMobileNo; } + public NlibLoginVO getNlibVO() { + return nlibVO; + } + + public void setNlibVO(NlibLoginVO nlibVO) { + this.nlibVO = nlibVO; + } + } diff --git a/src/main/java/nlib/user/service/NlibLoginVO.java b/src/main/java/nlib/user/service/NlibLoginVO.java index 0f0fd885..cf7d4326 100644 --- a/src/main/java/nlib/user/service/NlibLoginVO.java +++ b/src/main/java/nlib/user/service/NlibLoginVO.java @@ -40,6 +40,8 @@ public class NlibLoginVO implements Serializable { private String mobileNo; /* 휴대전화번호 */ private String password; /* 비밀번호 */ private String email; /* 이메일 */ + private String emailVrfctNo; /* 이메일 인증번호 */ + private String emailVrfctDd; /* 이메일 인증번호 발송일자 */ private String gender; /* 성별(M:남자,F:여자) */ private String zipCode; /* 우편번호 */ private String address; /* 주소 */ @@ -72,6 +74,8 @@ public class NlibLoginVO implements Serializable { private String error = null; /* 처리 오류코드 */ private String message = null; /* 처리 관련 메시지 */ + private String mobileVrfctNo = null; /* 본인확인 인증번호 */ + private String mobileVrfctDd = null; /* 본인확인 인증번호 발송일자 */ /** * 로그인인증키값을 리턴한다. 만일 존재하지 않을 경우, userId를 기반으로 인증키를 생성하여 리턴한다. * 로그인되지 않은 자(userId값이 존재하지 않는경우)에 대해서는 null을 리턴한다. @@ -352,5 +356,35 @@ public class NlibLoginVO implements Serializable { public void setMessage(String message) { this.message = message; } + public String getMobileVrfctNo() { + return mobileVrfctNo; + } + public void setMobileVrfctNo(String mobileVrfctNo) { + this.mobileVrfctNo = mobileVrfctNo; + } + + public String getMobileVrfctDd() { + return mobileVrfctDd; + } + + public void setMobileVrfctDd(String mobileVrfctDd) { + this.mobileVrfctDd = mobileVrfctDd; + } + public String getEmailVrfctNo() { + return emailVrfctNo; + } + + public void setEmailVrfctNo(String emailVrfctNo) { + this.emailVrfctNo = emailVrfctNo; + } + + public String getEmailVrfctDd() { + return emailVrfctDd; + } + + public void setEmailVrfctDd(String emailVrfctDd) { + this.emailVrfctDd = emailVrfctDd; + } + } From 98b266c8281b16078154b5b9677ddeb0cafe6fe2 Mon Sep 17 00:00:00 2001 From: JSYOO Date: Thu, 2 Sep 2021 10:50:40 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85?= =?UTF-8?q?=ED=8F=BC=20=EC=B2=98=EB=A6=AC=20=EC=A7=84=ED=96=89=EC=A4=91=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nlib/user/service/MemberService.java | 10 + .../nlib/user/service/impl/MemberDAO.java | 8 + .../user/service/impl/MemberServiceImpl.java | 29 ++- .../java/nlib/user/web/LoginController.java | 1 - .../java/nlib/user/web/MemberController.java | 210 ++++++++---------- .../mapper/nlib/user/MemberDAO_SQL.xml | 79 ++++++- src/main/resources/nlib/nlib.properties | 4 +- .../WEB-INF/jsp/nlib/login/loginForm.jsp | 2 +- .../nlib/member/accountConsolidationForm.jsp | 47 ++++ .../jsp/nlib/member/insertMemberInfoForm.jsp | 79 +++++-- .../nlib/member/selectMemberJoiningInfo.jsp | 2 +- .../WEB-INF/jsp/nlib/popup/jusoPopup.jsp | 76 ------- .../WEB-INF/jsp/nlib/userInfo/putMyInfo.jsp | 18 -- src/main/webapp/WEB-INF/tiles/inc/header.jsp | 2 +- 14 files changed, 320 insertions(+), 247 deletions(-) create mode 100644 src/main/webapp/WEB-INF/jsp/nlib/member/accountConsolidationForm.jsp delete mode 100644 src/main/webapp/WEB-INF/jsp/nlib/popup/jusoPopup.jsp diff --git a/src/main/java/nlib/user/service/MemberService.java b/src/main/java/nlib/user/service/MemberService.java index 8ad5f2a9..ca3471de 100644 --- a/src/main/java/nlib/user/service/MemberService.java +++ b/src/main/java/nlib/user/service/MemberService.java @@ -1,6 +1,10 @@ package nlib.user.service; +import java.util.HashMap; +import java.util.List; + +import egovframework.com.ext.oauth.service.OAuthUniversalUser; import nlib.restful.service.DataApiReqVO; import nlib.restful.service.DataApiResVO; @@ -47,5 +51,11 @@ public interface MemberService public String createInitPwd(); + public String selectAlreadySignUpId(OAuthUniversalUser oauthUser) throws Exception; + + public void insertMemberSns(OAuthUniversalUser oauthUser); + + public List selectAlreadySignUpMobile(NlibLoginVO loginVO) throws Exception; + } \ No newline at end of file diff --git a/src/main/java/nlib/user/service/impl/MemberDAO.java b/src/main/java/nlib/user/service/impl/MemberDAO.java index e8ed0fb9..d38ece6e 100644 --- a/src/main/java/nlib/user/service/impl/MemberDAO.java +++ b/src/main/java/nlib/user/service/impl/MemberDAO.java @@ -1,8 +1,12 @@ package nlib.user.service.impl; +import java.util.HashMap; +import java.util.List; + import org.springframework.stereotype.Repository; +import egovframework.com.ext.oauth.service.OAuthUniversalUser; import egovframework.rte.psl.dataaccess.mapper.Mapper; import nlib.restful.service.DataApiReqVO; import nlib.restful.service.DataApiResVO; @@ -31,5 +35,9 @@ public interface MemberDAO public DataApiResVO leaveMember(DataApiReqVO reqVO) throws Exception; + public void insertMemberSns(OAuthUniversalUser oauthUser); + public String selectAlreadySignUpId(OAuthUniversalUser oauthUser) throws Exception; + + public List selectAlreadySignUpMobile(NlibLoginVO loginVO) throws Exception; } \ No newline at end of file diff --git a/src/main/java/nlib/user/service/impl/MemberServiceImpl.java b/src/main/java/nlib/user/service/impl/MemberServiceImpl.java index edd4fa87..832278d1 100644 --- a/src/main/java/nlib/user/service/impl/MemberServiceImpl.java +++ b/src/main/java/nlib/user/service/impl/MemberServiceImpl.java @@ -3,6 +3,7 @@ package nlib.user.service.impl; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Random; @@ -10,11 +11,14 @@ import javax.annotation.Resource; import org.springframework.stereotype.Service; +import egovframework.com.ext.oauth.service.OAuthUniversalUser; import egovframework.rte.fdl.cryptography.EgovPasswordEncoder; +import nlib.cmm.crypto.AriaCrypto; import nlib.restful.service.DataApiReqVO; import nlib.restful.service.DataApiResVO; import nlib.user.service.MemberService; import nlib.user.service.NlibLoginVO; +import nlib.util.StringUtil; @Service("memberService") public class MemberServiceImpl implements MemberService @@ -25,7 +29,8 @@ public class MemberServiceImpl implements MemberService @Resource(name = "egovEnvPasswordEncoderService") EgovPasswordEncoder egovPasswordEncoder; - + @Resource(name = "ariaCrypto") + AriaCrypto ariaCrypto; public DataApiResVO selectMemberJoiningInfo(DataApiReqVO reqVO) { return null; @@ -192,4 +197,26 @@ public class MemberServiceImpl implements MemberService return dummyPW; } + public String selectAlreadySignUpId(OAuthUniversalUser oauthUser) throws Exception { + //이메일 암호화 + oauthUser.setSnsEmail(ariaCrypto.encode(oauthUser.getSnsUserId())); + return memberDAO.selectAlreadySignUpId(oauthUser); + } + + public void insertMemberSns(OAuthUniversalUser oauthUser) { + //사용자 데이터 암호화 + if(!(StringUtil.getString(oauthUser.getSnsBirthday(),"") == "")) + oauthUser.setSnsBirthday(ariaCrypto.encode(oauthUser.getSnsBirthday())); + if(!(StringUtil.getString(oauthUser.getSnsEmail(),"") == "")) + oauthUser.setSnsEmail(ariaCrypto.encode(oauthUser.getSnsEmail())); + if(!(StringUtil.getString(oauthUser.getSnsMobileNo(),"") == "")) + oauthUser.setSnsMobileNo(ariaCrypto.encode(oauthUser.getSnsMobileNo())); + memberDAO.insertMemberSns(oauthUser); + } + + public List selectAlreadySignUpMobile(NlibLoginVO loginVO) throws Exception { + loginVO.setMobileNo(ariaCrypto.encode(loginVO.getMobileNo())); + return memberDAO.selectAlreadySignUpMobile(loginVO); + } + } \ No newline at end of file diff --git a/src/main/java/nlib/user/web/LoginController.java b/src/main/java/nlib/user/web/LoginController.java index 44b561e7..db415f56 100644 --- a/src/main/java/nlib/user/web/LoginController.java +++ b/src/main/java/nlib/user/web/LoginController.java @@ -329,7 +329,6 @@ public class LoginController { redirectUrl = NlibProperty.getString("member.new.url"); // "/member/insertMemberInfoForm.do" return "redirect:" + redirectUrl; } - //----------------------------------------------- // 해당 처리기로 전환 //----------------------------------------------- diff --git a/src/main/java/nlib/user/web/MemberController.java b/src/main/java/nlib/user/web/MemberController.java index e1b66ade..5f14cb52 100644 --- a/src/main/java/nlib/user/web/MemberController.java +++ b/src/main/java/nlib/user/web/MemberController.java @@ -16,6 +16,7 @@ import java.util.Map; import java.util.Random; import javax.annotation.Resource; +import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @@ -34,6 +35,7 @@ import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; @@ -51,7 +53,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.github.scribejava.core.model.OAuth2AccessToken; +import egovframework.com.ext.oauth.service.OAuthConfig; +import egovframework.com.ext.oauth.service.OAuthLogin; +import egovframework.com.ext.oauth.service.OAuthUniversalUser; +import egovframework.com.ext.oauth.service.OAuthVO; import egovframework.rte.fdl.cryptography.EgovPasswordEncoder; +import nlib.cmm.crypto.AriaCrypto; +import nlib.cmm.service.NlibProperty; +import nlib.cmm.session.SessionConfig; import nlib.cmm.snslogin.GoogleOAuthResponse; import nlib.cmm.snslogin.KakaoController; import nlib.cmm.snslogin.NaverLoginBO; @@ -62,6 +71,7 @@ import nlib.restful.service.DataApiReqVO; import nlib.user.service.MemberService; import nlib.user.service.NlibLoginVO; import nlib.user.service.UserInfoService; +import nlib.util.StringUtil; import org.springframework.mail.javamail.JavaMailSender; @@ -91,6 +101,19 @@ import org.springframework.mail.javamail.JavaMailSender; @Controller public class MemberController { + //------------------------------------------- + // SNS 연동 환경설정 정보 : context-oauth.xml 참고 + //------------------------------------------- + @Inject + private OAuthVO naverAuthVO; /* 네이버 */ + + @Inject + private OAuthVO googleAuthVO; /* 구글 */ + + @Inject + private OAuthVO kakaoAuthVO; /* 카카오 */ + //------------------------------------------- + @Resource(name="userInfoService") private UserInfoService userInfoService; @@ -162,50 +185,68 @@ public class MemberController { return null; } + /** + * 약관 동의화면 + * @param req + * @param model + * @return + * @throws Exception + */ @RequestMapping(value="/member/selectMemberJoiningInfo.do") - public String selectMemberJoiningInfo(HttpServletRequest req,ModelMap model) { + public String selectMemberJoiningInfo(HttpServletRequest req,ModelMap model,HttpSession session) throws Exception { return "/nlib/member/selectMemberJoiningInfo"; } @RequestMapping(value="/member/snsCertForm.do") - public String snsCertForm(HttpSession session, Model model) throws Exception{ - // 네이버 로그인 URL 생성 - /* 네이버아이디로 인증 URL을 생성하기 위하여 naverLoginBO클래스의 getAuthorizationUrl메소드 호출 */ - naverLoginBO.setRedirect_url("http://nlib.nculture.org/nlib/member/naverCallback.do"); - String naverAuthUrl = naverLoginBO.getAuthorizationUrl(session); + public String snsCertForm(HttpSession session, + HttpServletRequest req, + @RequestParam(required = false) String error, + @RequestParam(required = false) String message, + Model model) throws Exception{ + //---------------------------------------------- + // SNS 연동 URL 생성 + //---------------------------------------------- + OAuthLogin naverLogin = new OAuthLogin(naverAuthVO, OAuthLogin.CALL_TYPE_MEMBER); + model.addAttribute("naverUrl", naverLogin.getOAuthURL()); - // 구글 로그인 URL 생성 - String googleUrl = "https://accounts.google.com/o/oauth2/v2/auth?" - + "client_id=879126511006-jro7bld7b2epl3n5mkksp0p24k2inbpu.apps.googleusercontent.com" - + "&redirect_uri=http://nlib.nculture.org/nlib/member/googleCallback.do" - + "&response_type=code" - + "&scope=email%20profile%20openid" - + "&access_type=offline"; - - // 카카오 로그인 URL 생성 - String k_redirect_url="http://nlib.nculture.org/nlib/member/kakaoCallback.do"; - String kakaoUrl = KakaoController.getAuthorizationUrl(session,k_redirect_url); + OAuthLogin googleLogin = new OAuthLogin(googleAuthVO, OAuthLogin.CALL_TYPE_MEMBER); + model.addAttribute("googleUrl", googleLogin.getOAuthURL()); - model.addAttribute("naverUrl", naverAuthUrl); - model.addAttribute("googleUrl", googleUrl); - model.addAttribute("kakaoUrl", kakaoUrl); + OAuthLogin kakaoLogin = new OAuthLogin(kakaoAuthVO, OAuthLogin.CALL_TYPE_MEMBER); + model.addAttribute("kakaoUrl", kakaoLogin.getOAuthURL()); + + model.addAttribute("error", error); + model.addAttribute("message", message); return "nlib/member/snsCertForm"; } + /** * 회원가입 폼 * @exception Exception */ @RequestMapping(value="/member/insertMemberInfoForm.do") public String insertMemberInfoForm(HttpServletRequest request,NlibLoginVO vo,HttpSession session,ModelMap model ) throws Exception{ - Map flashMap =RequestContextUtils.getInputFlashMap(request); - /*if(flashMap != null) + String jsessionId = session.getId(); + //String councilCd = (String)session.getAttribute("councilCd"); + //String councilReturnUrl = (String)session.getAttribute("councilReturnUrl"); + OAuthUniversalUser oauthUser = SessionConfig.getNewMemberInfo(jsessionId); + + String mId = null; + + // 등록된 ID가 있는 지 확인 + if(!(StringUtil.getString(oauthUser.getSnsUserId(),"")== "")) + mId =memberService.selectAlreadySignUpId(oauthUser); + + /* 등록된 ID가 있을때 통합처리 */ + if(!StringUtil.getString(mId, "").equals("")) { - vo.setLoginUserId(String.valueOf(flashMap.get("email"))); - }else { - return "forward:/member/selectMemberJoiningInfo.do"; - }*/ - model.addAttribute("loginVO",vo); + oauthUser.setMbInfoId(mId); + memberService.insertMemberSns(oauthUser); + //통합처리 url + return "redirect:/member/accountConsolidationForm.do"; + } + model.addAttribute("loginVO",oauthUser); return "nlib/member/insertMemberInfoForm"; } @@ -214,7 +255,23 @@ public class MemberController { * @exception Exception */ @RequestMapping(value="/member/insertMemberInfo.do") - public String insertMemberInfo(NlibLoginVO vo) throws Exception{ + public String insertMemberInfo(NlibLoginVO vo,ModelMap model) throws Exception{ + List voList = new ArrayList(); + // 등록된 전화번호가 있는 지 확인 (리스트) + voList = memberService.selectAlreadySignUpMobile(vo); + + /* 등록된 ID가 있을때 통합처리 */ + if(voList.size() > 0) + { + /* oauthUser.setMbInfoId(mId); + memberService.insertMemberSns(oauthUser);*/ + //통합처리 url + System.out.println(voList.get(0).getEmail()); + System.out.println(voList.get(0).getMbInfoId()); + model.addAttribute("result",voList); + return "nlib/member/accountConsolidationForm"; + } + //등록처리 요청 (data insert) memberService.insertMemberInfo(vo); @@ -235,9 +292,7 @@ public class MemberController { for(String readLine : list) { contents+=readLine; } - /*contents=contents.replaceAll("[$]\\{userName\\}","유종선");*/ - contents=contents.replace("${userName}","유종선"); - System.out.println(contents); + contents=contents.replace("${userName}",vo.getName()); return "nlib/member/insertMemberInfoResult"; } @@ -268,8 +323,8 @@ public class MemberController { * 핸드폰 인증번호 확인 * @exception Exception */ - @RequestMapping(value="/member/phoneCertNumChk.ajax" , method=RequestMethod.POST) - public @ResponseBody String phoneCertNumChk(HttpServletResponse response,HttpServletRequest request) throws Exception{ + @RequestMapping(value="/member/mobileCertNumChk.ajax" , method=RequestMethod.POST) + public @ResponseBody String mobileCertNumChk(HttpServletResponse response,HttpServletRequest request) throws Exception{ String mobileNo = request.getParameter("mobileNo"); String mobileCertNum = request.getParameter("mobileCertNum"); @@ -362,32 +417,6 @@ public class MemberController { return message; } - /** - * 회원가입 SNS 네이버인증 - * @param model - * @param code - * @param state - * @param session - * @return - * @throws IOException - * @throws ParseException - */ - @RequestMapping(value = "/member/naverCallback.do", method = { RequestMethod.GET, RequestMethod.POST }) - public String naverCallback(Model model, @RequestParam String code, @RequestParam String state, HttpSession session,RedirectAttributes rttr) - throws IOException, ParseException { - OAuth2AccessToken oauthToken; - oauthToken = naverLoginBO.getAccessToken(session, code, state); - // 로그인 사용자 정보를 읽어온다. - apiResult = naverLoginBO.getUserProfile(oauthToken); - JSONParser parser = new JSONParser(); - Object obj = parser.parse(apiResult); - JSONObject jsonObj = (JSONObject) obj; - JSONObject response_obj = (JSONObject) jsonObj.get("response"); - String email = (String) response_obj.get("email"); - rttr.addFlashAttribute("email",email); - /* 네이버 로그인 성공 페이지 View 호출 */ - return "redirect:/member/insertMemberInfoForm.do"; - } /** * 회원가입 SNS 구글인증 @@ -437,67 +466,4 @@ public class MemberController { rttr.addFlashAttribute("email",userInfo.get("email")); return "redirect:/member/insertMemberInfoForm.do"; }*/ - - /** - * 회원가입 SNS 카카오인증 - * @param code - * @param request - * @param response - * @param session - * @return - * @throws Exception - */ - @RequestMapping(value = "/member/kakaoCallback.do") - public String kakaoCallback(@RequestParam("code") String code, HttpServletRequest request, HttpServletResponse response, HttpSession session - ,RedirectAttributes rttr) - throws Exception { - ModelAndView mav = new ModelAndView(); - // 결과값을 node에 담아줌 - String k_redirect_url="http://nlib.nculture.org/nlib/member/kakaoCallback.do"; - JsonNode node = KakaoController.getAccessToken(code,k_redirect_url); - // accessToken에 사용자의 로그인한 모든 정보가 들어있음 - JsonNode accessToken = node.get("access_token"); - // 사용자의 정보 - JsonNode userInfo = KakaoController.getKakaoUserInfo(accessToken); - String kemail = null; - String kname = null; - String kgender = null; - String kbirthday = null; - String kage = null; - String kimage = null; - // 유저정보 카카오에서 가져오기Get properties - JsonNode properties = userInfo.path("properties"); - JsonNode kakao_account = userInfo.path("kakao_account"); - kemail = kakao_account.path("email").asText(); - kname = properties.path("nickname").asText(); - kimage = properties.path("profile_image").asText(); - kgender = kakao_account.path("gender").asText(); - kbirthday = kakao_account.path("birthday").asText(); - kage = kakao_account.path("age_range").asText(); - session.setAttribute("kemail", kemail); - session.setAttribute("kname", kname); - session.setAttribute("kimage", kimage); - session.setAttribute("kgender", kgender); - session.setAttribute("kbirthday", kbirthday); - session.setAttribute("kage", kage); - mav.setViewName("main"); - rttr.addFlashAttribute("email",kemail); - return "redirect:/member/insertMemberInfoForm.do"; - }// end kakaoLogin() - - /** - * 주소검색 팝업 - * @param request - * @param response - * @param session - * @return - * @throws Exception - */ - @RequestMapping(value = "/popup/jusoPopup.do") - public String jusoPopup(HttpServletRequest request, HttpServletResponse response, HttpSession session) - throws Exception { - - return "nlib/popup/jusoPopup"; - }// end kakaoLogin() - } \ No newline at end of file diff --git a/src/main/resources/egovframework/mapper/nlib/user/MemberDAO_SQL.xml b/src/main/resources/egovframework/mapper/nlib/user/MemberDAO_SQL.xml index c63c80db..910c7bc2 100644 --- a/src/main/resources/egovframework/mapper/nlib/user/MemberDAO_SQL.xml +++ b/src/main/resources/egovframework/mapper/nlib/user/MemberDAO_SQL.xml @@ -12,8 +12,10 @@ + + SELECT CONCAT(LEFT(MAX(USER_ID),2), @@ -25,6 +27,8 @@ VALUES (#{userId},#{loginUserId},'N',#{userNm},#{userPwd},#{birthdate},#{gender},#{telNo},#{zipcode},#{addr1},#{addr2},#{userId},#{userId}) + + UPDATE TMP_SM_USER @@ -32,10 +36,83 @@ USER_PWD=#{userPwd} ,MOD_ID = #{userId} ,MOD_DD = SYSDATE() - WHERE 1=1 AND LOGIN_USER_ID = #{loginUserId} AND TEL_NO = #{telNo} + + + + + + + + + INSERT INTO + MB_SNS + ( + MB_INFO_ID + ,SNS_TYPE + ,SNS_ID + ,SNS_NAME + ,SNS_NICK_NAME + ,SNS_USER_ID + ,SNS_GENDER + ,SNS_BIRTHDAY + ,SNS_EMAIL + ,SNS_MOBILE_NO + ,REG_DD + ,UNLINK_DD + ) + VALUES + ( + #{mbInfoId} + ,#{snsType} + ,#{snsId} + ,#{snsName} + ,{snsNickName} + ,#{snsUserId} + ,#{snsGender} + ,#{snsBirthday} + ,#{snsEmail} + ,#{snsMobileNo} + ,#{mbInfoId} + ,NULL + ); + + \ No newline at end of file diff --git a/src/main/resources/nlib/nlib.properties b/src/main/resources/nlib/nlib.properties index 5fa88365..cd61a3c7 100644 --- a/src/main/resources/nlib/nlib.properties +++ b/src/main/resources/nlib/nlib.properties @@ -20,7 +20,7 @@ home.uri = /index.do #---------------------------------------- # \ub85c\uadf8\uc778/\ud68c\uc6d0\uac00\uc785\uad00\ub828 URL \uc815\ubcf4 #---------------------------------------- -member.new.url = /member/selectMemberJoiningInfo.do +member.new.url = /member/snsCertForm.do # \ub85c\uadf8\uc778 \ub610\ub294 \uad8c\ud55c\uc5c6\ub294 \uacbd\uc6b0, \ub85c\uadf8\uc778\uc73c\ub85c \uc804\ud658\ucc98\ub9ac\ub418\uc5b4 \uc811\uc18d\ub418\ub294 \ucd5c\ucd08 \uc8fc\uc18c 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 @@ -28,7 +28,7 @@ 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.uri = /login/loginForm.do nculture.login.post.login.redirect.uri = /login/loginCouncilSSO.do -nculture.login.post.member.redirect.uri = /member/insertMemberInfoForm.do +nculture.login.post.member.redirect.uri = /member/selectMemberJoiningInfo.do nculture.login.preset.redirect.url = http://nlib.nculture.org/nlib/login/loginPreSet.do nculture.member.redirect.uri = /member/snsCertForm.do 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 8281b9e7..35fef86e 100644 --- a/src/main/webapp/WEB-INF/jsp/nlib/login/loginForm.jsp +++ b/src/main/webapp/WEB-INF/jsp/nlib/login/loginForm.jsp @@ -40,7 +40,7 @@ + diff --git a/src/main/webapp/WEB-INF/jsp/nlib/member/selectMemberJoiningInfo.jsp b/src/main/webapp/WEB-INF/jsp/nlib/member/selectMemberJoiningInfo.jsp index 00e68a07..5cbd0afb 100644 --- a/src/main/webapp/WEB-INF/jsp/nlib/member/selectMemberJoiningInfo.jsp +++ b/src/main/webapp/WEB-INF/jsp/nlib/member/selectMemberJoiningInfo.jsp @@ -34,7 +34,7 @@ function snsCertForm(){ if(document.getElementById('agree').checked) { - location.href="${pageContext.request.contextPath}/member/snsCertForm.do"; + location.href="${pageContext.request.contextPath}/member/insertMemberInfoForm.do"; } else{ alert("약관에 동의해주세요"); diff --git a/src/main/webapp/WEB-INF/jsp/nlib/popup/jusoPopup.jsp b/src/main/webapp/WEB-INF/jsp/nlib/popup/jusoPopup.jsp deleted file mode 100644 index ba2f5e4d..00000000 --- a/src/main/webapp/WEB-INF/jsp/nlib/popup/jusoPopup.jsp +++ /dev/null @@ -1,76 +0,0 @@ -<% -/** - *
- * @Class Name : jusoPopup.jsp
- * 
- * @Description : 주소 API
- * 
- * 
- * @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
- *
- * 
- * - * @ ------------ -------- --------------------------- - * @ 수정일 수정자 수정내용 - * @ ------------ -------- --------------------------- - * @ 2021. 7. 12. JSYOO 최초 생성 - * - * - * @author 이씨플라자 * DIGITALSHIP JSYOO - * @since 2021. 7. 12. - * @version 1.0 - * - */ - %> -<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> - - - - -Insert title here -<% - request.setCharacterEncoding("UTF-8"); //한글깨지면 주석제거 - //request.setCharacterEncoding("EUC-KR"); //해당시스템의 인코딩타입이 EUC-KR일경우에 - String inputYn = request.getParameter("inputYn"); - String zipNo = request.getParameter("zipNo"); - String roadAddrPart1 = request.getParameter("roadAddrPart1"); - String roadAddrPart2 = request.getParameter("roadAddrPart2"); - String addrDetail = request.getParameter("addrDetail"); - -%> - - - -
- - - - - - -
- - \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/nlib/userInfo/putMyInfo.jsp b/src/main/webapp/WEB-INF/jsp/nlib/userInfo/putMyInfo.jsp index 25c9fbbf..c805ce51 100644 --- a/src/main/webapp/WEB-INF/jsp/nlib/userInfo/putMyInfo.jsp +++ b/src/main/webapp/WEB-INF/jsp/nlib/userInfo/putMyInfo.jsp @@ -106,15 +106,6 @@ function update(){ } } -function goPopup(){ - // 주소검색을 수행할 팝업 페이지를 호출합니다. - // 호출된 페이지(jusopopup.jsp)에서 실제 주소검색URL(http://www.juso.go.kr/addrlink/addrLinkUrl.do)를 호출하게 됩니다. - var pop = window.open("/nlib/popup/jusoPopup.do","pop","width=570,height=420, scrollbars=yes, resizable=yes"); - - // 모바일 웹인 경우, 호출된 페이지(jusopopup.jsp)에서 실제 주소검색URL(http://www.juso.go.kr/addrlink/addrMobileLinkUrl.do)를 호출하게 됩니다. - //var pop = window.open("/popup/jusoPopup.jsp","pop","scrollbars=yes, resizable=yes"); -} - <% //핸드폰 인증번호 받기 %> @@ -171,14 +162,6 @@ function certNumCheck(){ }) } -function jusoCallBack(zipNo,roadAddrPart,addrDetail){ - // 팝업페이지에서 주소입력한 정보를 받아서, 현 페이지에 정보를 등록합니다. - $("#zipCode").val(zipNo); - $("#address").val(roadAddrPart); - $("#addressDetail").val(addrDetail); -} - - document.addEventListener('keydown', function(event) { if (event.keyCode === 13) { event.preventDefault(); @@ -428,5 +411,4 @@ label.error { - \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/tiles/inc/header.jsp b/src/main/webapp/WEB-INF/tiles/inc/header.jsp index 49bb0ed5..a2d08428 100644 --- a/src/main/webapp/WEB-INF/tiles/inc/header.jsp +++ b/src/main/webapp/WEB-INF/tiles/inc/header.jsp @@ -31,7 +31,7 @@ String councilNm = (String)session.getAttribute("councilCd");
  • ID/PW찾기
  • -
  • 회원가입
  • +
  • 회원가입