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 68c3207c..ed6f1b24 100644 --- a/src/main/java/egovframework/com/ext/oauth/service/OAuthLogin.java +++ b/src/main/java/egovframework/com/ext/oauth/service/OAuthLogin.java @@ -23,19 +23,10 @@ public class OAuthLogin { public OAuthLogin(OAuthVO oauthVO) { - this(oauthVO, null); - } - - public OAuthLogin(OAuthVO oauthVO, String councilJsessionId) { - // CallBack 호출될 경우, 지방문화원 원세션ID를 다시 전달받을 수 있도록 포함 처리 (2021.08.23 KKN) this.oauthService = new ServiceBuilder(oauthVO.getClientId()) .apiSecret(oauthVO.getClientSecret()) - .callback( - StringUtil.isEmpty(councilJsessionId) ? - oauthVO.getRedirectUrl() : - appendUrlParam(oauthVO.getRedirectUrl(), LoginService.COUNCIL_JSESSION_ID_NAME, councilJsessionId) - ) + .callback(oauthVO.getRedirectUrl()) .scope("profile") .build(oauthVO.getApi20Instance()); diff --git a/src/main/java/nlib/security/SecUserDetailsService.java b/src/main/java/nlib/security/SecUserDetailsService.java index a697dedb..9986fb16 100644 --- a/src/main/java/nlib/security/SecUserDetailsService.java +++ b/src/main/java/nlib/security/SecUserDetailsService.java @@ -52,12 +52,12 @@ public class SecUserDetailsService implements UserDetailsService { * @see org.springframework.security.core.userdetails.UserDetailsService#loadUserByUsername(java.lang.String) */ @Override - public UserDetails loadUserByUsername(String loginUserId) throws UsernameNotFoundException { + public UserDetails loadUserByUsername(String councilloginUserId) throws UsernameNotFoundException { - SecUserVO secUserVO = secUserDAO.loadUserByUsername(loginUserId); + SecUserVO secUserVO = secUserDAO.loadUserByUsername(councilloginUserId); if(secUserVO == null) { - throw new UsernameNotFoundException(loginUserId); + throw new UsernameNotFoundException(councilloginUserId); } return secUserVO; } diff --git a/src/main/java/nlib/security/SecUserVO.java b/src/main/java/nlib/security/SecUserVO.java index 37c4db2b..3b047957 100644 --- a/src/main/java/nlib/security/SecUserVO.java +++ b/src/main/java/nlib/security/SecUserVO.java @@ -76,7 +76,8 @@ public class SecUserVO extends NlibLoginVO implements UserDetails { */ @Override public String getUsername() { - return super.getLoginUserId(); + // 로그인하는 지방문화원 코드 + 로그인사용자ID + return super.getUsername(); } /* 계정이 만료되지 않았는 지 여부를 리턴한다. (true: 만료안됨) diff --git a/src/main/java/nlib/user/service/LoginService.java b/src/main/java/nlib/user/service/LoginService.java index d2fa6219..3216f238 100644 --- a/src/main/java/nlib/user/service/LoginService.java +++ b/src/main/java/nlib/user/service/LoginService.java @@ -14,8 +14,6 @@ import nlib.restful.service.DataApiResVO; public interface LoginService { - public final String COUNCIL_JSESSION_ID_NAME = "councilJsessionId"; /* 지방문화원 회원 세션ID 저장변수명 */ - //------------------------------- // 로그인 오류코드 //------------------------------- @@ -28,9 +26,9 @@ public interface LoginService public String login(HttpServletRequest req, String username, String password); - public String loginOauth(HttpServletRequest req, String oauthServiceName, String snsId, String councilJsessionId); + public String loginOauth(HttpServletRequest req, String oauthServiceName, String snsId, String joinCouncilCd, String councilJsessionId); - public String loginCouncilSSO(HttpServletRequest req, String councilJsessionId); + public String loginCouncilSSO(HttpServletRequest req, String joinCouncilCd, String councilJsessionId); public DataApiResVO logout(DataApiReqVO reqVO); diff --git a/src/main/java/nlib/user/service/NlibLoginVO.java b/src/main/java/nlib/user/service/NlibLoginVO.java index 0bf522ab..0f0fd885 100644 --- a/src/main/java/nlib/user/service/NlibLoginVO.java +++ b/src/main/java/nlib/user/service/NlibLoginVO.java @@ -98,6 +98,17 @@ public class NlibLoginVO implements Serializable { } + /** + * 지방문화원코드+계정의 이름을 리턴한다. (사용자ID:email형식의 LOGIN_USER_ID 정보) + * Spring Security 처리 용 + * (non-Javadoc) + * @see org.springframework.security.core.userdetails.UserDetails#getUsername() + */ + public String getUsername() { + // 로그인하는 지방문화원 코드 + 로그인사용자ID + return StringUtil.getString(getJoinCouncilCd(), "") + "@" + getLoginUserId(); + } + //---------------------------------------------------------------- // SETTER.GETTER //---------------------------------------------------------------- diff --git a/src/main/java/nlib/user/service/impl/LoginServiceImpl.java b/src/main/java/nlib/user/service/impl/LoginServiceImpl.java index 0465abc9..e40e8fae 100644 --- a/src/main/java/nlib/user/service/impl/LoginServiceImpl.java +++ b/src/main/java/nlib/user/service/impl/LoginServiceImpl.java @@ -73,7 +73,7 @@ public class LoginServiceImpl implements LoginService * - ERR_CODE_REQ_SNSLOGIN : SNS 정상적인 로그인이 필요 * - ERR_CODE_REQ_MEMBERSHIP : 신규회원가입/회원통합 필요 */ - public String loginOauth(HttpServletRequest req, String oauthServiceName, String snsId, String councilJsessionId) { + public String loginOauth(HttpServletRequest req, String oauthServiceName, String snsId, String joinCouncilCd, String councilJsessionId) { if(StringUtil.isEmpty(snsId)) return ERR_CODE_REQ_SNSLOGIN; @@ -81,6 +81,7 @@ public class LoginServiceImpl implements LoginService NlibLoginVO nLoginParamVO = new NlibLoginVO(); nLoginParamVO.setSnsId(snsId); nLoginParamVO.setSnsType(oauthServiceName); + nLoginParamVO.setJoinCouncilCd(joinCouncilCd); NlibLoginVO nLoginVO = loginDAO.selectLoginUserInfo(nLoginParamVO); if(nLoginVO == null) { @@ -101,7 +102,7 @@ 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 councilJsessionId) { + public String loginCouncilSSO(HttpServletRequest req, String joinCouncilCd, String councilJsessionId) { // 세션에서 로그인 처리 가능 정보 가져오기 String loginInfo[] = SessionConfig.getLoginInfo(councilJsessionId); @@ -119,7 +120,7 @@ public class LoginServiceImpl implements LoginService NlibLoginVO nLoginParamVO = new NlibLoginVO(); nLoginParamVO.setSnsId(snsId); nLoginParamVO.setSnsType(oauthServiceName); - + nLoginParamVO.setJoinCouncilCd(joinCouncilCd); NlibLoginVO nLoginVO = loginDAO.selectLoginUserInfo(nLoginParamVO); if(nLoginVO == null) { @@ -127,7 +128,7 @@ public class LoginServiceImpl implements LoginService } // Spring Security 로그인처리위한 token 생성하여 로그인 처리 - UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(nLoginVO.getLoginUserId(), nLoginVO.getPassword()); + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(nLoginVO.getUsername(), nLoginVO.getPassword()); NlibLoginVO nlibLoginedVO = loginProcSecurity(req, token); if(StringUtil.isNotEmpty(nlibLoginedVO.getError())) { diff --git a/src/main/java/nlib/user/web/LoginController.java b/src/main/java/nlib/user/web/LoginController.java index 9e9291a2..ddc097cf 100644 --- a/src/main/java/nlib/user/web/LoginController.java +++ b/src/main/java/nlib/user/web/LoginController.java @@ -168,7 +168,7 @@ public class LoginController { //---------------------------------------------- // 지방문화원 사이트에서 접속한 경우, 지방문화원 정보 확인 //---------------------------------------------- - String councilJsessionId = paramMap.get(LoginService.COUNCIL_JSESSION_ID_NAME); + String councilJsessionId = paramMap.get("councilJsessionId"); String councilDnsHost = paramMap.get("councilDnsHost"); String councilReturnUrl = StringUtil.decodeBase64(paramMap.get("councilReturnUrl")); String councilHomeUrl = StringUtil.decodeBase64(paramMap.get("councilHomeUrl")); @@ -182,7 +182,7 @@ public class LoginController { log.debug("loginForm > councilCd = " + councilCd); log.debug("loginForm > councilNm = " + councilNm); - session.setAttribute(LoginService.COUNCIL_JSESSION_ID_NAME, councilJsessionId); + session.setAttribute("councilJsessionId", councilJsessionId); session.setAttribute("councilDnsHost", councilDnsHost); session.setAttribute("councilReturnUrl", councilReturnUrl); session.setAttribute("councilHomeUrl" , councilHomeUrl); @@ -192,15 +192,15 @@ public class LoginController { //---------------------------------------------- // SNS 연동 URL 생성 //---------------------------------------------- - OAuthLogin naverLogin = new OAuthLogin(naverAuthVO, councilJsessionId); + OAuthLogin naverLogin = new OAuthLogin(naverAuthVO); log.debug("naverLogin.getOAuthURL() = "+naverLogin.getOAuthURL()); model.addAttribute("naverUrl", naverLogin.getOAuthURL()); - OAuthLogin googleLogin = new OAuthLogin(googleAuthVO, councilJsessionId); + OAuthLogin googleLogin = new OAuthLogin(googleAuthVO); log.debug("googleLogin.getOAuthURL() = "+googleLogin.getOAuthURL()); model.addAttribute("googleUrl", googleLogin.getOAuthURL()); - OAuthLogin kakaoLogin = new OAuthLogin(kakaoAuthVO, councilJsessionId); + OAuthLogin kakaoLogin = new OAuthLogin(kakaoAuthVO); log.debug("kakaoLogin.getOAuthURL() = "+kakaoLogin.getOAuthURL()); model.addAttribute("kakaoUrl", kakaoLogin.getOAuthURL()); @@ -227,22 +227,22 @@ public class LoginController { public String loginOauthCallback( HttpServletRequest req, @PathVariable String oauthServiceName, - @RequestParam Map paramMap, + @RequestParam(required = false) String code, Model model, HttpSession session) throws Exception { String redirectUrl = NlibProperty.getString("home.uri"); // "/index.do"; - String code = paramMap.get("code"); - String councilJsessionId = paramMap.get(LoginService.COUNCIL_JSESSION_ID_NAME); + String councilJsessionId = (String)session.getAttribute("councilJsessionId"); + String councilCd = (String)session.getAttribute("councilCd"); log.debug("oauthLoginCallback: code = ", code); // SNS 클라이언트 설정 정보 할당 OAuthVO oauthVO = null; - if (StringUtil.equalsIgnoreCase(OAuthConfig.GOOGLE_SERVICE_NAME, oauthServiceName)) - oauthVO = googleAuthVO; - else if (StringUtil.equalsIgnoreCase(OAuthConfig.NAVER_SERVICE_NAME, oauthServiceName)) + if (StringUtil.equalsIgnoreCase(OAuthConfig.NAVER_SERVICE_NAME, oauthServiceName)) oauthVO = naverAuthVO; + else if (StringUtil.equalsIgnoreCase(OAuthConfig.GOOGLE_SERVICE_NAME, oauthServiceName)) + oauthVO = googleAuthVO; else if (StringUtil.equalsIgnoreCase(OAuthConfig.KAKAO_SERVICE_NAME, oauthServiceName)) oauthVO = kakaoAuthVO; else { @@ -253,7 +253,7 @@ public class LoginController { // 1. code를 이용해서 Access Token 받기 // 2. Access Token을 이용해서 사용자 제공정보 가져오기 //----------------------------------------------- - OAuthLogin oauthLogin = new OAuthLogin(oauthVO, councilJsessionId); + OAuthLogin oauthLogin = new OAuthLogin(oauthVO); OAuthUniversalUser oauthUser = oauthLogin.getUserProfile(code); // 1,2번 동시 log.debug("oauthLoginCallback > Profile ===>>" + oauthUser.getSnsId() + ", " + oauthUser.getName()); @@ -267,7 +267,7 @@ public class LoginController { //----------------------------------------------- // 등록된 사용자 여부 확인 //----------------------------------------------- - String loginResult = loginService.loginOauth(req, oauthServiceName, oauthUser.getSnsId(), councilJsessionId); + String loginResult = loginService.loginOauth(req, oauthServiceName, oauthUser.getSnsId(), councilCd, councilJsessionId); // 정상 SNS 연동 로그인 if(loginResult == null) { @@ -348,7 +348,8 @@ public class LoginController { String redirectUrl = "/index.do"; String jsessionId = session.getId(); - String loginResult = loginService.loginCouncilSSO(req, session.getId()); + String councilCd = (String)session.getAttribute("councilCd"); + String loginResult = loginService.loginCouncilSSO(req, councilCd, jsessionId); // oAuth를 통한 SNS연동 성공인 경우 if(loginResult == null) { diff --git a/src/main/resources/egovframework/mapper/nlib/user/LoginDAO_SQL.xml b/src/main/resources/egovframework/mapper/nlib/user/LoginDAO_SQL.xml index 3d936d49..7fbc87ef 100644 --- a/src/main/resources/egovframework/mapper/nlib/user/LoginDAO_SQL.xml +++ b/src/main/resources/egovframework/mapper/nlib/user/LoginDAO_SQL.xml @@ -4,6 +4,7 @@