Merge remote-tracking branch 'origin/master'

This commit is contained in:
JSYOO 2021-09-02 16:43:53 +09:00
commit eb1ccbdfd6
9 changed files with 213 additions and 16 deletions

View File

@ -44,10 +44,10 @@ public class SessionConfig implements HttpSessionListener {
private static final String DELIMITER = "\t"; private static final String DELIMITER = "\t";
/* 세션별 로그인 처리 가능한 정보 목록 */ /* 세션별 로그인 처리 가능한 정보 목록 */
private static final Map<String, OAuthUniversalUser> loginSessions = new ConcurrentHashMap<>(); private static final Map<String, Object> loginSessions = new ConcurrentHashMap<>();
/* 세션별 회원가입 처리 가능한 정보 목록 */ /* 세션별 회원가입 처리 가능한 정보 목록 */
private static final Map<String, OAuthUniversalUser> memberSessions = new ConcurrentHashMap<>(); private static final Map<String, Object> memberSessions = new ConcurrentHashMap<>();
@Override @Override
public void sessionCreated(HttpSessionEvent se) { public void sessionCreated(HttpSessionEvent se) {
@ -77,7 +77,7 @@ public class SessionConfig implements HttpSessionListener {
log.debug("setLoginInfo : " + sessionId + ", " + oUser.getSnsType() + ", " + oUser.getSnsId()); log.debug("setLoginInfo : " + sessionId + ", " + oUser.getSnsType() + ", " + oUser.getSnsId());
loginSessions.put(sessionId, oUser); loginSessions.put(sessionId, oUser);
} }
/** /**
* 지방문화원 해당 세션에 로그인 처리 가능한 SNS 유형 SNS ID 정보를 리턴한다. * 지방문화원 해당 세션에 로그인 처리 가능한 SNS 유형 SNS ID 정보를 리턴한다.
* 리턴유형 문자열 배열 * 리턴유형 문자열 배열
@ -91,7 +91,7 @@ public class SessionConfig implements HttpSessionListener {
if(StringUtil.isEmpty(sessionId)) return null; if(StringUtil.isEmpty(sessionId)) return null;
return loginSessions.get(sessionId); return (OAuthUniversalUser)loginSessions.get(sessionId);
} }
/** /**
@ -147,7 +147,7 @@ public class SessionConfig implements HttpSessionListener {
public static OAuthUniversalUser getNewMemberInfo(String sessionId) { public static OAuthUniversalUser getNewMemberInfo(String sessionId) {
if(StringUtil.isEmpty(sessionId)) return null; if(StringUtil.isEmpty(sessionId)) return null;
return memberSessions.get(sessionId); return (OAuthUniversalUser)memberSessions.get(sessionId);
} }
/** /**

View File

@ -61,11 +61,7 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override @Override
protected void configure(HttpSecurity http) throws Exception { protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests() http.authorizeRequests()
.antMatchers("/login/login*.do").permitAll() .antMatchers("/login/**").permitAll()
.antMatchers("/login/logout*.do").permitAll()
.antMatchers("/login/naver/*.do").permitAll()
.antMatchers("/login/google/*.do").permitAll()
.antMatchers("/login/kakao/*.do").permitAll()
.antMatchers("/member/*.do").permitAll() .antMatchers("/member/*.do").permitAll()
.antMatchers("/member/*.ajax").permitAll() .antMatchers("/member/*.ajax").permitAll()
.antMatchers("/member/naver/*.do").permitAll() .antMatchers("/member/naver/*.do").permitAll()

View File

@ -20,7 +20,10 @@ public interface LoginService
public final String ERR_CODE_DISABLE = "ERR_CODE_LOGIN_DISABLE"; /* 오류코드 : 계정유효하지 않음 */ public final String ERR_CODE_DISABLE = "ERR_CODE_LOGIN_DISABLE"; /* 오류코드 : 계정유효하지 않음 */
public final String ERR_CODE_MISMATCH = "ERR_CODE_LOGIN_MISMATCH"; /* 오류코드 : ID,PW일치하지 않음 */ public final String ERR_CODE_MISMATCH = "ERR_CODE_LOGIN_MISMATCH"; /* 오류코드 : ID,PW일치하지 않음 */
public final String ERR_CODE_EXC = "ERR_CODE_LOGIN_EXC"; /* 오류코드 : 기타오류 */ public final String ERR_CODE_EXC = "ERR_CODE_LOGIN_EXC"; /* 오류코드 : 기타오류 */
public final String ERR_CODE_REQ_AGREE = "ERR_CODE_REQ_AGREE"; /* 오류코드 : 해당지방문화원 정보제공 동의 필요 */
public final String WRN_CODE_DORMANT = "WRN_CODE_DOMANT"; /* 경고코드 : 휴면계정 */
public String login(HttpServletRequest req, String username, String password); public String login(HttpServletRequest req, String username, String password);
public String loginOauth(HttpServletRequest req, String oauthServiceName, String snsId, String joinCouncilCd, String councilJsessionId); public String loginOauth(HttpServletRequest req, String oauthServiceName, String snsId, String joinCouncilCd, String councilJsessionId);
@ -30,4 +33,6 @@ public interface LoginService
public DataApiResVO logout(DataApiReqVO reqVO); public DataApiResVO logout(DataApiReqVO reqVO);
public HashMap<String, String> selectCouncilInfoByDnsHost(String councilDnsHost); public HashMap<String, String> selectCouncilInfoByDnsHost(String councilDnsHost);
public int activateDormantAcc(NlibLoginVO loginVO);
} }

View File

@ -32,4 +32,8 @@ public class LoginDAO extends EgovComAbstractDAO {
public HashMap<String, String> selectCouncilInfoByDnsHost(String councilDnsHost) { public HashMap<String, String> selectCouncilInfoByDnsHost(String councilDnsHost) {
return (HashMap<String, String>) selectOne("LoginDAO.selectCouncilInfoByDnsHost", councilDnsHost); return (HashMap<String, String>) selectOne("LoginDAO.selectCouncilInfoByDnsHost", councilDnsHost);
} }
public int activateDormantAcc(NlibLoginVO loginVO) {
return update("LoginDAO.activateDormantAcc", loginVO);
}
} }

View File

@ -121,6 +121,17 @@ public class LoginServiceImpl implements LoginService
return ERR_CODE_REQ_MEMBERSHIP; return ERR_CODE_REQ_MEMBERSHIP;
} }
// 해당 지방문화원에 미등록된 경우, 정보제공 동의로 이동 처리 필요
if(StringUtil.isEmpty(nLoginVO.getJoinCouncilCd())) {
return ERR_CODE_REQ_AGREE;
}
// 휴면계좌 확인
if("P".equals(nLoginVO.getStatus())) {
oUser.setNlibVO(nLoginVO);
return WRN_CODE_DORMANT;
}
// Spring Security 로그인처리위한 token 생성하여 로그인 처리 // Spring Security 로그인처리위한 token 생성하여 로그인 처리
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(nLoginVO.getUsername(), nLoginVO.getPassword()); UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(nLoginVO.getUsername(), nLoginVO.getPassword());
NlibLoginVO nlibLoginedVO = loginProcSecurity(req, token); NlibLoginVO nlibLoginedVO = loginProcSecurity(req, token);
@ -195,7 +206,9 @@ public class LoginServiceImpl implements LoginService
return loginDAO.selectCouncilInfoByDnsHost(councilDnsHost); return loginDAO.selectCouncilInfoByDnsHost(councilDnsHost);
} }
public int activateDormantAcc(NlibLoginVO loginVO) {
return loginDAO.activateDormantAcc(loginVO);
}

View File

@ -18,14 +18,15 @@
, A.ADDRESS_DETAIL , A.ADDRESS_DETAIL
, A.BIRTHDAY , A.BIRTHDAY
, A.STATUS , A.STATUS
, DATE_FORMAT(A.DMT_PROC_DD, '%Y%m%d%H%i%s') AS DMT_PROC_DD
, A.JOIN_DATE , A.JOIN_DATE
, A.VERIFICATION_DD , DATE_FORMAT(A.VERIFICATION_DD, '%Y%m%d%H%i%s') AS VERIFICATION_DD
, A.LAST_ACCESS_DD , DATE_FORMAT(A.LAST_ACCESS_DD, '%Y%m%d%H%i%s') AS LAST_ACCESS_DD
, A.LEAVE_SITE_DATE , A.LEAVE_SITE_DATE
, A.REG_ID , A.REG_ID
, A.REG_DD , DATE_FORMAT(A.REG_DD, '%Y%m%d%H%i%s') AS REG_DD
, A.MOD_ID , A.MOD_ID
, A.MOD_DD , DATE_FORMAT(A.MOD_DD, '%Y%m%d%H%i%s') AS MOD_DD
, B.SNS_TYPE , B.SNS_TYPE
, B.SNS_ID , B.SNS_ID
, 'ROLE_USER' AS AUTHORITY_LIST , 'ROLE_USER' AS AUTHORITY_LIST
@ -50,6 +51,16 @@
LIMIT 1 LIMIT 1
</select> </select>
<update id="activateDormantAcc" parameterType="NlibLoginVO">
UPDATE UAC_CLTR_DB.MB_INFO A /* 사용자정보 */
SET A.STATUS = 'S' /* 정상 */
, A.DMT_PROC_DD = NULL
, A.MOD_ID = #{mbInfoId}
, A.MOD_DD = NOW()
WHERE MB_INFO_ID = #{mbInfoId}
AND A.STATUS = 'P' /* 휴면 */
</update>
<insert id="insertLoginLog" parameterType="NlibLoginVO"> <insert id="insertLoginLog" parameterType="NlibLoginVO">
INSERT INTO SM_ACC_LOG /* 접속로그 */ INSERT INTO SM_ACC_LOG /* 접속로그 */
( USER_ID ( USER_ID

View File

@ -25,6 +25,11 @@ member.new.url = /member/snsCertForm.do
login.url = /login/loginCouncil.do 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 # \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 login.back.url = /login/loginForm.do
# \ud734\uba74\uacc4\uc88c \ud574\uc9c0\uc548\ub0b4 \uc8fc\uc18c
login.dormant.url = /login/activateDormantAccForm.do
# \uc2e0\uaddc \uc9c0\ubc29\ubb38\ud654\uc6d0 \uc815\ubcf4\uc81c\uacf5 \ub3d9\uc758 \uc8fc\uc18c
login.newcouncil.url = /login/agreeProvInfoForm.do
# \uc9c0\ubc29\ubb38\ud654\uc6d0\uc5d0\uc11c \uc811\uc18d\uc2dc \ub9ac\ub2e4\uc774\ub809\ud2b8\ub420 URL \uc815\ubcf4 # \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.redirect.uri = /login/loginForm.do
nculture.login.post.login.redirect.uri = /login/loginCouncilSSO.do nculture.login.post.login.redirect.uri = /login/loginCouncilSSO.do
@ -58,7 +63,7 @@ dataapi.server.protocol = http
dataapi.temp.xml.path = C:/iams/workspace/nlib/data/dataxml dataapi.temp.xml.path = C:/iams/workspace/nlib/data/dataxml
# Aria \uc54c\uace0\ub9ac\uc998 # Aria \uc54c\uace0\ub9ac\uc998
crypto.aria.defaultKey = TheFederationOfKoreaCultureCenter027042322 crypto.aria.defaultKey = gdyYs/IZqY86VcWhT8emCYfqY1ahw2vtLG+/FzNqtrQ=
#---------------------------------------- #----------------------------------------

View File

@ -0,0 +1,83 @@
<%
/**
* <pre>
* @Class Name : activateDormantAccForm.jsp
*
* @Description : 휴면계좌 해지안내 및 확인 화면
*
*
* @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
*
* </pre>
*
* @ ------------ -------- ---------------------------
* @ 수정일 수정자 수정내용
* @ ------------ -------- ---------------------------
* @ 2021. 9. 1. KNKIM 최초 생성
*
*
* @author 이씨플라자 * DIGITALSHIP KNKIM
* @since 2021. 9. 1.
* @version 1.0
*
*/
%>
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%>
<c:set var="pageTitle">휴면계좌안내</c:set>
<!DOCTYPE html>
<html>
<head>
<title>LoginTest</title>
<script src = "//developers.kakao.com/sdk/js/kakao.min.js"></script>
<script type="text/javascript" src="https://static.nid.naver.com/js/naverLogin_implicit-1.0.2.js" charset="utf-8"></script>
<script src="https://apis.google.com/js/api:client.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
<script>
function signUp(){
location.href="${pageContext.request.contextPath}/member/selectMemberJoiningInfo.do";
}
function findInfo(){
location.href="${pageContext.request.contextPath}/member/initPasswordForm.do";
}
</script>
</head>
<body>
<br>
<h1>휴면계좌안내</h1>
<form name="dormantForm" id="dormantForm"
action="${pageContext.request.contextPath}/login/activateDormantAcc.do"
method="post">
<br />
<input type="text" id="mbInfoId" name="mbInfoId" value="${oauthUser.nlibVO.mbInfoId}" />
<br />
사용자 계정이 아래와 같이 휴면된 상태입니다. <br />
<br />
- 이름 : ${oauthUser.nlibVO.name}<br />
- 로그인ID : ${oauthUser.nlibVO.loginUserId}<br />
- 이메일 : ${oauthUser.nlibVO.email}<br />
- 휴면전환일자 :
<fmt:parseDate value="${oauthUser.nlibVO.dmtProcDd}" var="dmtProcDd" pattern="yyyyMMddHHmmss"/>
<fmt:formatDate value="${dmtProcDd}" pattern="yyyy.MM.dd HH:mm"/><br />
<br/>
정상적인 서비스를 이용하시려면 휴면상태를 해제하여야 합니다. <br />
휴면상태를 해제하시겠습니까?
<br/>
<input type="submit" id="activateBtn" name="activateBtn" value="예, 해제합니다." />
<input type="button" id="inactivateBtn" name="" value="홈화면 이동" onclick="javascript: location.href = '${pageContext.request.contextPath}';" />
</form>
</body>
</html>

View File

@ -0,0 +1,80 @@
<%
/**
* <pre>
* @Class Name : agreeProvInfoForm.jsp
*
* @Description : 신규 지방문화원 정보제공 동의 화면
*
*
* @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
*
* </pre>
*
* @ ------------ -------- ---------------------------
* @ 수정일 수정자 수정내용
* @ ------------ -------- ---------------------------
* @ 2021. 9. 1. KNKIM 최초 생성
*
*
* @author 이씨플라자 * DIGITALSHIP KNKIM
* @since 2021. 9. 1.
* @version 1.0
*
*/
%>
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%>
<c:set var="pageTitle">지방문화원 정보제공 동의</c:set>
<!DOCTYPE html>
<html>
<head>
<title>LoginTest</title>
<script src = "//developers.kakao.com/sdk/js/kakao.min.js"></script>
<script type="text/javascript" src="https://static.nid.naver.com/js/naverLogin_implicit-1.0.2.js" charset="utf-8"></script>
<script src="https://apis.google.com/js/api:client.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
<script>
function signUp(){
location.href="${pageContext.request.contextPath}/member/selectMemberJoiningInfo.do";
}
function findInfo(){
location.href="${pageContext.request.contextPath}/member/initPasswordForm.do";
}
</script>
</head>
<body>
<br>
<h1>${pageTitle }</h1>
<form name="agreeForm" id="agreeForm"
action="${pageContext.request.contextPath}/login/agreeProvInfo.do"
method="post">
<br />
<input type="text" id="mbInfoId" name="mbInfoId" value="${oauthUser.nlibVO.mbInfoId}" />
<br />
사용자 계정이 아래와 같이 휴면된 상태입니다. <br />
<br />
- 이름 : ${oauthUser.nlibVO.name}<br />
- 로그인ID : ${oauthUser.nlibVO.loginUserId}<br />
- 이메일 : ${oauthUser.nlibVO.email}<br />
- 동의대상 지방문화원 : ${councilCd } ${councilNm }
<br/>
"${councilNm }" 서비스를 이용하시려면 해당 문화원에 사용자 정보제공에 동의가 필요합니다.<br />
동의하시겠습니까?
<br/>
<input type="submit" id="activateBtn" name="activateBtn" value="예, 동의합니다." />
<input type="button" id="inactivateBtn" name="" value="홈화면 이동" onclick="javascript: location.href = '${pageContext.request.contextPath}';" />
</form>
</body>
</html>