사용자 정보 조회 및 로그인 처리 시, 지방문화원코드 포함 처리

This commit is contained in:
KNKIM 2021-08-26 16:23:29 +09:00
parent 9f5ad43cb2
commit f74297334e
9 changed files with 49 additions and 39 deletions

View File

@ -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());

View File

@ -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;
}

View File

@ -76,7 +76,8 @@ public class SecUserVO extends NlibLoginVO implements UserDetails {
*/
@Override
public String getUsername() {
return super.getLoginUserId();
// 로그인하는 지방문화원 코드 + 로그인사용자ID
return super.getUsername();
}
/* 계정이 만료되지 않았는 여부를 리턴한다. (true: 만료안됨)

View File

@ -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);

View File

@ -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
//----------------------------------------------------------------

View File

@ -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())) {

View File

@ -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<String, String> 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) {

View File

@ -4,6 +4,7 @@
<mapper namespace="LoginDAO">
<select id="selectLoginUserInfo" parameterType="NlibLoginVO" resultType="NlibLoginVO">
<![CDATA[
SELECT
A.MB_INFO_ID
, A.LOGIN_USER_ID
@ -28,13 +29,17 @@
, B.SNS_TYPE
, B.SNS_ID
, 'ROLE_USER' AS AUTHORITY_LIST
, C.JOIN_COUNCIL_CD
FROM UAC_CLTR_DB.MB_INFO A /* 사용자정보 */
JOIN UAC_CLTR_DB.MB_SNS B /* 사용자 SNS 정보 */
ON A.MB_INFO_ID = B.MB_INFO_ID
LEFT OUTER JOIN UAC_CLTR_DB.MB_SITE /* 가입문화원정보 */ C
ON A.MB_INFO_ID = C.MB_INFO_ID AND C.JOIN_COUNCIL_CD = #{joinCouncilCd}
WHERE B.SNS_ID = #{snsId}
AND UPPER(SNS_TYPE) = UPPER(#{snsType})
AND B.UNLINK_DD IS NULL /* 연동해제건 제외 */
LIMIT 1
AND B.UNLINK_DD IS NULL /* 연동해제건 제외 */
LIMIT 1
]]>
</select>
<select id="selectCouncilInfoByDnsHost" parameterType="String" resultType="HashMap">

View File

@ -31,7 +31,9 @@
FROM UAC_CLTR_DB.MB_INFO A /* 사용자정보 */
JOIN UAC_CLTR_DB.MB_SNS B /* 사용자 SNS 정보 */
ON A.MB_INFO_ID = B.MB_INFO_ID
WHERE A.LOGIN_USER_ID = #{loginUserId}
JOIN UAC_CLTR_DB.MB_SITE /* 가입문화원정보 */ C
ON A.MB_INFO_ID = C.MB_INFO_ID
WHERE CONCAT(C.JOIN_COUNCIL_CD, '@', A.LOGIN_USER_ID) = #{councilloginUserId}
LIMIT 1
</select>