

250326 김혜민 중복로그인수정 및 세션방식 반영
@f4fc74f344eb2b6ac507ecb0678929fcdd45dd34
+++ src/main/java/com/takensoft/cms/loginPolicy/dao/LoginModeDAO.java
... | ... | @@ -0,0 +1,33 @@ |
1 | +package com.takensoft.cms.loginPolicy.dao; | |
2 | + | |
3 | +import com.takensoft.cms.loginPolicy.vo.LoginModeVO; | |
4 | +import com.takensoft.cms.loginPolicy.vo.LoginPolicyVO; | |
5 | +import org.egovframe.rte.psl.dataaccess.mapper.Mapper; | |
6 | + | |
7 | +/** | |
8 | + * @author 김혜민 | |
9 | + * @since 2025.03.22 | |
10 | + * @modification | |
11 | + * since | author | description | |
12 | + * 2025.03.22 | 김혜민 | 최초 등록 | |
13 | + * | |
14 | + * 로그인 방식 관련 DAO | |
15 | + */ | |
16 | +@Mapper("loginModeDAO") | |
17 | +public interface LoginModeDAO { | |
18 | + | |
19 | + /** | |
20 | + * @return String - 중복로그인 여부 | |
21 | + * | |
22 | + * 로그인방식 조회 | |
23 | + */ | |
24 | + String selectLatestLoginMode(); | |
25 | + | |
26 | + /** | |
27 | + * @param loginModeVO - 로그인 방식 정보 | |
28 | + * @return int - 로그인 방식 저장 결과 | |
29 | + * | |
30 | + * 로그인방식 저장 | |
31 | + */ | |
32 | + int insertLoginMode(LoginModeVO loginModeVO); | |
33 | +} |
--- src/main/java/com/takensoft/cms/loginPolicy/dao/LoginPolicyDAO.java
+++ src/main/java/com/takensoft/cms/loginPolicy/dao/LoginPolicyDAO.java
... | ... | @@ -1,11 +1,7 @@ |
1 | 1 |
package com.takensoft.cms.loginPolicy.dao; |
2 | 2 |
|
3 |
-import com.takensoft.cms.accesCtrl.vo.AccesCtrlVO; |
|
4 | 3 |
import com.takensoft.cms.loginPolicy.vo.LoginPolicyVO; |
5 |
-import com.takensoft.common.Pagination; |
|
6 | 4 |
import org.egovframe.rte.psl.dataaccess.mapper.Mapper; |
7 |
- |
|
8 |
-import java.util.List; |
|
9 | 5 |
|
10 | 6 |
/** |
11 | 7 |
* @author 김혜민 |
... | ... | @@ -14,13 +10,13 @@ |
14 | 10 |
* since | author | description |
15 | 11 |
* 2025.03.22 | 김혜민 | 최초 등록 |
16 | 12 |
* |
17 |
- * 중복로그인 허용 관련 DAO |
|
13 |
+ * 중복로그인 관련 DAO |
|
18 | 14 |
*/ |
19 | 15 |
@Mapper("loginPolicyDAO") |
20 | 16 |
public interface LoginPolicyDAO { |
21 | 17 |
|
22 | 18 |
/** |
23 |
- * @return Boolean - 중복로그인 여부 |
|
19 |
+ * @return String - 중복로그인 여부 |
|
24 | 20 |
* |
25 | 21 |
* 중복로그인 조회 |
26 | 22 |
*/ |
+++ src/main/java/com/takensoft/cms/loginPolicy/service/LoginModeService.java
... | ... | @@ -0,0 +1,31 @@ |
1 | +package com.takensoft.cms.loginPolicy.service; | |
2 | + | |
3 | +import com.takensoft.cms.loginPolicy.vo.LoginModeVO; | |
4 | + | |
5 | +/** | |
6 | + * @author 김혜민 | |
7 | + * @since 2024.05.21 | |
8 | + * @modification | |
9 | + * since | author | description | |
10 | + * 2024.05.21 | 김혜민 | 최초 등록 | |
11 | + * | |
12 | + * 로그인 방식 관련 인터페이스 | |
13 | + */ | |
14 | +public interface LoginModeService { | |
15 | + | |
16 | + /** | |
17 | + * | |
18 | + * @return LoginPolicyVO - 로그인 방식 조회 | |
19 | + * | |
20 | + * 로그인 방식 조회 | |
21 | + */ | |
22 | + public String getLoginMode(); | |
23 | + /** | |
24 | + * @param loginModeVO - 로그인 방식 정보 | |
25 | + * @return ResponseEntity - 로그인 방식 수정 결과를 포함하는 응답 | |
26 | + * | |
27 | + * 로그인 방식 수정 | |
28 | + */ | |
29 | + public int insertLoginMode(LoginModeVO loginModeVO); | |
30 | + | |
31 | +}(파일 끝에 줄바꿈 문자 없음) |
--- src/main/java/com/takensoft/cms/loginPolicy/service/LoginPolicyService.java
+++ src/main/java/com/takensoft/cms/loginPolicy/service/LoginPolicyService.java
... | ... | @@ -1,14 +1,6 @@ |
1 | 1 |
package com.takensoft.cms.loginPolicy.service; |
2 | 2 |
|
3 |
-import com.takensoft.cms.bbs.vo.BbsCnVO; |
|
4 | 3 |
import com.takensoft.cms.loginPolicy.vo.LoginPolicyVO; |
5 |
-import com.takensoft.common.Pagination; |
|
6 |
-import org.springframework.dao.DataAccessException; |
|
7 |
-import org.springframework.web.multipart.MultipartFile; |
|
8 |
- |
|
9 |
-import java.util.HashMap; |
|
10 |
-import java.util.List; |
|
11 |
-import java.util.Map; |
|
12 | 4 |
|
13 | 5 |
/** |
14 | 6 |
* @author 김혜민 |
... | ... | @@ -29,8 +21,8 @@ |
29 | 21 |
*/ |
30 | 22 |
public boolean getPolicy(); |
31 | 23 |
/** |
32 |
- * @param loginPolicyVO - 접근 제어 정보 |
|
33 |
- * @return ResponseEntity - 접근 제어 수정 결과를 포함하는 응답 |
|
24 |
+ * @param loginPolicyVO - 중복로그인 정보 |
|
25 |
+ * @return ResponseEntity - 중복로그인 수정 결과를 포함하는 응답 |
|
34 | 26 |
* |
35 | 27 |
* 중복로그인 수정 |
36 | 28 |
*/ |
+++ src/main/java/com/takensoft/cms/loginPolicy/service/impl/LoginModeServiceImpl.java
... | ... | @@ -0,0 +1,54 @@ |
1 | +package com.takensoft.cms.loginPolicy.service.impl; | |
2 | + | |
3 | +import com.takensoft.cms.loginPolicy.dao.LoginModeDAO; | |
4 | +import com.takensoft.cms.loginPolicy.service.LoginModeService; | |
5 | +import com.takensoft.cms.loginPolicy.vo.LoginModeVO; | |
6 | +import com.takensoft.common.idgen.service.IdgenService; | |
7 | +import lombok.RequiredArgsConstructor; | |
8 | +import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl; | |
9 | +import org.springframework.stereotype.Service; | |
10 | + | |
11 | +/** | |
12 | + * @author 김혜민 | |
13 | + * @since 2024.05.21 | |
14 | + * @modification | |
15 | + * since | author | description | |
16 | + * 2024.05.21 | 김혜민 | 최초 등록 | |
17 | + * | |
18 | + * EgovAbstractServiceImpl : 전자정부 상속 | |
19 | + * LoginModeService : 중복 로그인 관련 인터페이스 상속 | |
20 | + * | |
21 | + * 로그인 방식 관련 인터페이스 구현체 | |
22 | + */ | |
23 | +@Service("loginModeService") | |
24 | +@RequiredArgsConstructor | |
25 | +public class LoginModeServiceImpl extends EgovAbstractServiceImpl implements LoginModeService { | |
26 | + | |
27 | + private final LoginModeDAO loginModeDAO; | |
28 | + private final IdgenService loginModeIdgen; | |
29 | + | |
30 | + /** | |
31 | + * @return Boolean - 중복로그인 여부 | |
32 | + * | |
33 | + * 로그인 방식 조회 | |
34 | + */ | |
35 | + @Override | |
36 | + public String getLoginMode() { | |
37 | + | |
38 | + return loginModeDAO.selectLatestLoginMode(); | |
39 | + } | |
40 | + | |
41 | + /** | |
42 | + * @param loginModeVO - 로그인 방식 정보 | |
43 | + * @return int - 로그인 방식 저장 결과 | |
44 | + * | |
45 | + * 로그인 방식 저장 | |
46 | + */ | |
47 | + @Override | |
48 | + public int insertLoginMode(LoginModeVO loginModeVO) { | |
49 | + loginModeVO.setLgnModeId(loginModeIdgen.getNextStringId()); // ID 자동 생성 | |
50 | + return loginModeDAO.insertLoginMode(loginModeVO); | |
51 | + } | |
52 | + | |
53 | + | |
54 | +}(파일 끝에 줄바꿈 문자 없음) |
--- src/main/java/com/takensoft/cms/loginPolicy/service/impl/LoginPolicyServiceImpl.java
+++ src/main/java/com/takensoft/cms/loginPolicy/service/impl/LoginPolicyServiceImpl.java
... | ... | @@ -1,32 +1,12 @@ |
1 | 1 |
package com.takensoft.cms.loginPolicy.service.impl; |
2 | 2 |
|
3 |
-import com.takensoft.cms.bbs.dao.BbsCnDAO; |
|
4 |
-import com.takensoft.cms.bbs.dao.BbsMngDAO; |
|
5 |
-import com.takensoft.cms.bbs.dao.WordMngDAO; |
|
6 |
-import com.takensoft.cms.bbs.service.BbsCnService; |
|
7 |
-import com.takensoft.cms.bbs.vo.BbsCnVO; |
|
8 |
-import com.takensoft.cms.bbs.vo.BbsMngVO; |
|
9 | 3 |
import com.takensoft.cms.loginPolicy.dao.LoginPolicyDAO; |
10 | 4 |
import com.takensoft.cms.loginPolicy.service.LoginPolicyService; |
11 | 5 |
import com.takensoft.cms.loginPolicy.vo.LoginPolicyVO; |
12 |
-import com.takensoft.common.Pagination; |
|
13 |
-import com.takensoft.common.exception.*; |
|
14 |
-import com.takensoft.common.file.dao.FileDAO; |
|
15 |
-import com.takensoft.common.file.service.FileMngService; |
|
16 |
-import com.takensoft.common.file.vo.FileMngVO; |
|
17 | 6 |
import com.takensoft.common.idgen.service.IdgenService; |
18 |
-import com.takensoft.common.util.JWTUtil; |
|
19 | 7 |
import lombok.RequiredArgsConstructor; |
20 | 8 |
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl; |
21 |
-import org.springframework.beans.factory.annotation.Value; |
|
22 |
-import org.springframework.dao.DataAccessException; |
|
23 | 9 |
import org.springframework.stereotype.Service; |
24 |
-import org.springframework.transaction.annotation.Transactional; |
|
25 |
-import org.springframework.web.multipart.MultipartFile; |
|
26 |
- |
|
27 |
-import java.util.HashMap; |
|
28 |
-import java.util.List; |
|
29 |
-import java.util.Map; |
|
30 | 10 |
|
31 | 11 |
/** |
32 | 12 |
* @author 김혜민 |
... | ... | @@ -36,7 +16,7 @@ |
36 | 16 |
* 2024.05.21 | 김혜민 | 최초 등록 |
37 | 17 |
* |
38 | 18 |
* EgovAbstractServiceImpl : 전자정부 상속 |
39 |
- * LoginPolicyService : 중복 로그인 관련 인터페이스 상속 |
|
19 |
+ * LoginMultiService : 중복 로그인 관련 인터페이스 상속 |
|
40 | 20 |
* |
41 | 21 |
* 중복 로그인 관련 인터페이스 구현체 |
42 | 22 |
*/ |
+++ src/main/java/com/takensoft/cms/loginPolicy/vo/LoginModeVO.java
... | ... | @@ -0,0 +1,27 @@ |
1 | +package com.takensoft.cms.loginPolicy.vo; | |
2 | + | |
3 | +import lombok.AllArgsConstructor; | |
4 | +import lombok.Getter; | |
5 | +import lombok.NoArgsConstructor; | |
6 | +import lombok.Setter; | |
7 | + | |
8 | +/** | |
9 | + * @author : 김혜민 | |
10 | + * @since : 2025.03.22 | |
11 | + * @modification | |
12 | + * since | author | description | |
13 | + * 2025.03.22 | 김혜민 | 최초 등록 | |
14 | + * | |
15 | + * 로그인 방식 설정 관련 VO | |
16 | + */ | |
17 | +@Getter | |
18 | +@Setter | |
19 | +@NoArgsConstructor | |
20 | +@AllArgsConstructor | |
21 | +public class LoginModeVO { | |
22 | + | |
23 | + private String lgnModeId; // 로그인 방식 설정 ID | |
24 | + private String lgnMode; // 로그인 방식 (JWT / SESSION) | |
25 | + private String rgtrId; // 등록자 ID | |
26 | + private String regDt; // 등록일시 | |
27 | +}(파일 끝에 줄바꿈 문자 없음) |
--- src/main/java/com/takensoft/cms/loginPolicy/vo/LoginPolicyVO.java
+++ src/main/java/com/takensoft/cms/loginPolicy/vo/LoginPolicyVO.java
... | ... | @@ -21,6 +21,7 @@ |
21 | 21 |
public class LoginPolicyVO { |
22 | 22 |
|
23 | 23 |
private String policyId; // 중복로그인 ID |
24 |
- private boolean allowMultipleLogin; // 중복 로그인 허용 여부 |
|
25 |
- private String rgtr; // 수정한 관리자 ID |
|
24 |
+ private boolean allowMultipleLogin; // 중복 로그인 허용 여부 |
|
25 |
+ private String rgtr; // 수정한 관리자 ID |
|
26 |
+ private String regDt; // 등록일시 |
|
26 | 27 |
}(파일 끝에 줄바꿈 문자 없음) |
--- src/main/java/com/takensoft/cms/loginPolicy/web/LoginPolicyController.java
+++ src/main/java/com/takensoft/cms/loginPolicy/web/LoginPolicyController.java
... | ... | @@ -1,6 +1,8 @@ |
1 | 1 |
package com.takensoft.cms.loginPolicy.web; |
2 | 2 |
|
3 |
+import com.takensoft.cms.loginPolicy.service.LoginModeService; |
|
3 | 4 |
import com.takensoft.cms.loginPolicy.service.LoginPolicyService; |
5 |
+import com.takensoft.cms.loginPolicy.vo.LoginModeVO; |
|
4 | 6 |
import com.takensoft.cms.loginPolicy.vo.LoginPolicyVO; |
5 | 7 |
import com.takensoft.common.message.MessageCode; |
6 | 8 |
import com.takensoft.common.util.JWTUtil; |
... | ... | @@ -26,33 +28,34 @@ |
26 | 28 |
@RestController |
27 | 29 |
@RequiredArgsConstructor |
28 | 30 |
@Slf4j |
29 |
-@RequestMapping(value = "/admin/allowMultipleLogin") |
|
31 |
+@RequestMapping(value = "/admin/loginPolicy") |
|
30 | 32 |
public class LoginPolicyController { |
31 | 33 |
|
32 | 34 |
private final LoginPolicyService loginPolicyService; |
35 |
+ private final LoginModeService loginModeService; |
|
33 | 36 |
private final ResponseUtil resUtil; |
34 | 37 |
private final JWTUtil jwtUtil; |
35 | 38 |
|
36 | 39 |
/** |
37 | 40 |
* |
38 |
- * @return ResponseEntity - 접근 제어 목록 조회 결과를 포함하는 응답 |
|
41 |
+ * @return ResponseEntity - 중복로그인 조회 결과를 포함하는 응답 |
|
39 | 42 |
* |
40 | 43 |
* 중복로그인 조회 |
41 | 44 |
*/ |
42 |
- @GetMapping("/login-policy") |
|
43 |
- public ResponseEntity<?> getPolicy() { |
|
45 |
+ @GetMapping("/getLoginPolicy.json") |
|
46 |
+ public ResponseEntity<?> getLoginPolicy() { |
|
44 | 47 |
Boolean isAllowed = loginPolicyService.getPolicy(); |
45 | 48 |
return resUtil.successRes(isAllowed, MessageCode.COMMON_SUCCESS); |
46 | 49 |
} |
47 | 50 |
|
48 | 51 |
/** |
49 |
- * @param params - 접근 제어 정보 |
|
50 |
- * @return ResponseEntity - 접근 제어 수정 결과를 포함하는 응답 |
|
52 |
+ * @param params - 중복로그인 정보 |
|
53 |
+ * @return ResponseEntity - 중복로그인 결과를 포함하는 응답 |
|
51 | 54 |
* |
52 | 55 |
* 중복로그인 수정 |
53 | 56 |
*/ |
54 |
- @PostMapping("/login-policy") |
|
55 |
- public ResponseEntity<?> updatePolicy(@RequestBody Map<String, Object> params, HttpServletRequest request) { |
|
57 |
+ @PostMapping("/saveLoginPolicy.json") |
|
58 |
+ public ResponseEntity<?> saveLoginPolicy(@RequestBody Map<String, Object> params, HttpServletRequest request) { |
|
56 | 59 |
try { |
57 | 60 |
boolean allow = (Boolean) params.get("allowMultipleLogin"); |
58 | 61 |
|
... | ... | @@ -82,4 +85,53 @@ |
82 | 85 |
} |
83 | 86 |
} |
84 | 87 |
|
88 |
+ /** |
|
89 |
+ * |
|
90 |
+ * @return ResponseEntity - 로그인 방식 조회 결과를 포함하는 응답 |
|
91 |
+ * |
|
92 |
+ * 로그인 방식 조회 |
|
93 |
+ */ |
|
94 |
+ @GetMapping("/getLoginMode.json") |
|
95 |
+ public Object getLoginMode() { |
|
96 |
+ String loginMode = loginModeService.getLoginMode(); |
|
97 |
+ return resUtil.successRes(loginMode, MessageCode.COMMON_SUCCESS); |
|
98 |
+ } |
|
99 |
+ |
|
100 |
+ /** |
|
101 |
+ * |
|
102 |
+ * @return ResponseEntity - 로그인 방식 저장 결과를 포함하는 응답 |
|
103 |
+ * |
|
104 |
+ * 로그인 방식 저장 |
|
105 |
+ */ |
|
106 |
+ @PostMapping("/saveLoginMode.json") |
|
107 |
+ public ResponseEntity<?> saveLoginMode(@RequestBody Map<String, Object> params, HttpServletRequest request) { |
|
108 |
+ try { |
|
109 |
+ String lgnMode = params.get("lgnMode").toString(); |
|
110 |
+ |
|
111 |
+ String token = request.getHeader("Authorization"); |
|
112 |
+ String mbrId = (String) jwtUtil.getClaim(token, "mbrId"); |
|
113 |
+ |
|
114 |
+ if (mbrId == null || mbrId.isBlank()) { |
|
115 |
+ return resUtil.errorRes(MessageCode.COMMON_BAD_REQUEST); |
|
116 |
+ } |
|
117 |
+ |
|
118 |
+ LoginModeVO loginModeVO = new LoginModeVO(); |
|
119 |
+ loginModeVO.setLgnMode(lgnMode); |
|
120 |
+ loginModeVO.setRgtrId(mbrId); |
|
121 |
+ |
|
122 |
+ int result = loginModeService.insertLoginMode(loginModeVO); |
|
123 |
+ |
|
124 |
+ if (result > 0) { |
|
125 |
+ return resUtil.successRes(result, MessageCode.COMMON_SUCCESS); |
|
126 |
+ } else { |
|
127 |
+ return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL); // 저장 실패 |
|
128 |
+ } |
|
129 |
+ |
|
130 |
+ } catch (DuplicateKeyException e) { |
|
131 |
+ return resUtil.errorRes(MessageCode.COMMON_DUPLICATION_DATA); // 중복 저장 |
|
132 |
+ } catch (Exception e) { |
|
133 |
+ return resUtil.errorRes(MessageCode.COMMON_UNKNOWN_ERROR); // 기타 예외 |
|
134 |
+ } |
|
135 |
+ } |
|
136 |
+ |
|
85 | 137 |
} |
--- src/main/java/com/takensoft/cms/token/service/impl/RefreshTokenServiceImpl.java
+++ src/main/java/com/takensoft/cms/token/service/impl/RefreshTokenServiceImpl.java
... | ... | @@ -8,6 +8,7 @@ |
8 | 8 |
import com.takensoft.common.config.RedisConfig; |
9 | 9 |
import com.takensoft.common.util.HttpRequestUtil; |
10 | 10 |
import com.takensoft.common.util.JWTUtil; |
11 |
+import com.takensoft.common.util.LoginUtil; |
|
11 | 12 |
import io.jsonwebtoken.ExpiredJwtException; |
12 | 13 |
import lombok.RequiredArgsConstructor; |
13 | 14 |
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl; |
... | ... | @@ -47,7 +48,7 @@ |
47 | 48 |
private final RefreshTokenDAO refreshTokenDAO; |
48 | 49 |
private final JWTUtil jwtUtil; |
49 | 50 |
private final HttpRequestUtil httpRequestUtil; |
50 |
- private final RedisConfig redisConfig; |
|
51 |
+ private final LoginUtil loginUtil; |
|
51 | 52 |
private final RedisTemplate<String, String> redisTemplate; |
52 | 53 |
|
53 | 54 |
@Value("${jwt.accessTime}") |
... | ... | @@ -148,7 +149,7 @@ |
148 | 149 |
refreshTknVO.setMbrId((String) jwtUtil.getClaim(refreshTokenCheck(req).get("refreshToken").toString(), "mbrId")); |
149 | 150 |
|
150 | 151 |
//중복로그인 비허용시 삭제 |
151 |
- if (!redisConfig.isAllowMultipleLogin()) { |
|
152 |
+ if (!loginUtil.isAllowMultipleLogin()) { |
|
152 | 153 |
redisTemplate.delete("jwt:" + refreshTknVO.getMbrId()); // 기존 JWT 삭제 |
153 | 154 |
} |
154 | 155 |
return delete(req, refreshTknVO); |
... | ... | @@ -179,7 +180,7 @@ |
179 | 180 |
String userId = (String) jwtUtil.getClaim(refreshToken, "mbrId"); |
180 | 181 |
|
181 | 182 |
// 중복 로그인 비허용 체크 (DB에 저장된 리프레시 토큰과 비교) |
182 |
- if (!redisConfig.isAllowMultipleLogin()) { |
|
183 |
+ if (!loginUtil.isAllowMultipleLogin()) { |
|
183 | 184 |
String storedRefreshToken = redisTemplate.opsForValue().get("jwt:" + userId); |
184 | 185 |
|
185 | 186 |
if (storedRefreshToken == null || !storedRefreshToken.equals(refreshToken)) { |
... | ... | @@ -238,7 +239,7 @@ |
238 | 239 |
public int delete(HttpServletRequest req, RefreshTknVO refreshTknVO) { |
239 | 240 |
refreshTknVO.setUseIp(httpRequestUtil.getIp(req)); |
240 | 241 |
//중복로그인 비허용시 삭제 |
241 |
- if (!redisConfig.isAllowMultipleLogin()) { |
|
242 |
+ if (!loginUtil.isAllowMultipleLogin()) { |
|
242 | 243 |
redisTemplate.delete("jwt:" + refreshTknVO.getMbrId()); // 기존 JWT 삭제 |
243 | 244 |
} |
244 | 245 |
return refreshTokenDAO.deleteByRefresh(refreshTknVO); |
--- src/main/java/com/takensoft/common/config/RedisConfig.java
+++ src/main/java/com/takensoft/common/config/RedisConfig.java
... | ... | @@ -28,12 +28,6 @@ |
28 | 28 |
@Value("${redis.port}") |
29 | 29 |
private int redisPort; |
30 | 30 |
|
31 |
- private final LoginPolicyService loginPolicyService; |
|
32 |
- |
|
33 |
- public RedisConfig(LoginPolicyService loginPolicyService) { |
|
34 |
- this.loginPolicyService = loginPolicyService; |
|
35 |
- } |
|
36 |
- |
|
37 | 31 |
@Bean |
38 | 32 |
@ConditionalOnProperty(name = "config.allow-multiple-logins", havingValue = "false", matchIfMissing = true) //redis 사용 안 할 경우 빈 등록x |
39 | 33 |
public RedisConnectionFactory redisConnectionFactory() { |
... | ... | @@ -47,16 +41,6 @@ |
47 | 41 |
redisTemp.setKeySerializer(new StringRedisSerializer()); |
48 | 42 |
redisTemp.setValueSerializer(new StringRedisSerializer()); |
49 | 43 |
return redisTemp; |
50 |
- } |
|
51 |
- |
|
52 |
- /** |
|
53 |
- * @return allowMultipleLogin - 중복로그인 허용/비허용 반환 |
|
54 |
- * |
|
55 |
- * 중복 로그인 허용 여부를 반환하는 메서드 |
|
56 |
- */ |
|
57 |
- public boolean isAllowMultipleLogin() { |
|
58 |
- Boolean result = loginPolicyService.getPolicy(); |
|
59 |
- return result; |
|
60 | 44 |
} |
61 | 45 |
|
62 | 46 |
} |
--- src/main/java/com/takensoft/common/config/SecurityConfig.java
+++ src/main/java/com/takensoft/common/config/SecurityConfig.java
... | ... | @@ -6,10 +6,12 @@ |
6 | 6 |
import com.takensoft.common.filter.AccesFilter; |
7 | 7 |
import com.takensoft.common.filter.JWTFilter; |
8 | 8 |
import com.takensoft.common.filter.LoginFilter; |
9 |
+import com.takensoft.common.filter.SessionAuthFilter; |
|
9 | 10 |
import com.takensoft.common.util.HttpRequestUtil; |
10 | 11 |
import com.takensoft.common.exception.CustomAccessDenieHandler; |
11 | 12 |
import com.takensoft.common.exception.CustomAuthenticationEntryPoint; |
12 | 13 |
import com.takensoft.common.util.JWTUtil; |
14 |
+import com.takensoft.common.util.LoginUtil; |
|
13 | 15 |
import org.springframework.beans.factory.annotation.Value; |
14 | 16 |
import org.springframework.context.annotation.Bean; |
15 | 17 |
import org.springframework.context.annotation.Configuration; |
... | ... | @@ -52,6 +54,7 @@ |
52 | 54 |
private final HttpRequestUtil httpRequestUtil; |
53 | 55 |
private final AppConfig appConfig; |
54 | 56 |
private final RedisConfig redisConfig; |
57 |
+ private final LoginUtil loginUtil; |
|
55 | 58 |
|
56 | 59 |
private static String FRONT_URL; // 프론트 접근 허용 URL |
57 | 60 |
private static long JWT_ACCESSTIME; // access 토큰 유지 시간 |
... | ... | @@ -61,21 +64,21 @@ |
61 | 64 |
private final RedisTemplate<String, String> redisTemplate; |
62 | 65 |
|
63 | 66 |
/** |
67 |
+ * @param authenticationConfiguration - 인증 구성 객체 |
|
68 |
+ * @param jwtUtil - JWT 유틸리티 객체 |
|
69 |
+ * @param authenticationEntryPoint - 인증 실패 시 처리 엔트리 포인트 |
|
70 |
+ * @param accessDenieHandler - 접근 거부 처리 핸들러 |
|
71 |
+ * @param loginUtil |
|
64 | 72 |
* @param fUrl - 프론트엔드 URL (application.yml에서 값을 읽어 옴) |
65 | 73 |
* @param aTime - JWT 접근 토큰 유효 시간 (application.yml에서 값을 읽어 옴) |
66 | 74 |
* @param rTime - JWT 리프레시 토큰 유효 시간 (application.yml에서 값을 읽어 옴) |
67 | 75 |
* @param ctime - 쿠키 유효 시간 (application.yml에서 값을 읽어 옴) |
68 |
- * @param authenticationConfiguration - 인증 구성 객체 |
|
69 |
- * @param authenticationEntryPoint - 인증 실패 시 처리 엔트리 포인트 |
|
70 |
- * @param accessDenieHandler - 접근 거부 처리 핸들러 |
|
71 |
- * @param jwtUtil - JWT 유틸리티 객체 |
|
72 | 76 |
* @param redisTemplate |
73 |
- * |
|
74 |
- * SecurityConfig 생성자 |
|
77 |
+* |
|
75 | 78 |
*/ |
76 | 79 |
public SecurityConfig(AuthenticationConfiguration authenticationConfiguration, JWTUtil jwtUtil, RefreshTokenService refreshTokenService, AccesCtrlService accesCtrlService, AppConfig appConfig, RedisConfig redisConfig, |
77 | 80 |
LgnHstryService lgnHstryService, CustomAuthenticationEntryPoint authenticationEntryPoint, CustomAccessDenieHandler accessDenieHandler, HttpRequestUtil httpRequestUtil, |
78 |
- @Value("${front.url}")String fUrl, @Value("${jwt.accessTime}")long aTime, @Value("${jwt.refreshTime}")long rTime, @Value("${cookie.time}")int ctime, RedisTemplate<String, String> redisTemplate) { |
|
81 |
+ LoginUtil loginUtil, @Value("${front.url}") String fUrl, @Value("${jwt.accessTime}") long aTime, @Value("${jwt.refreshTime}") long rTime, @Value("${cookie.time}") int ctime, RedisTemplate<String, String> redisTemplate) { |
|
79 | 82 |
|
80 | 83 |
this.authenticationConfiguration = authenticationConfiguration; |
81 | 84 |
this.refreshTokenService = refreshTokenService; |
... | ... | @@ -87,6 +90,7 @@ |
87 | 90 |
this.httpRequestUtil = httpRequestUtil; |
88 | 91 |
this.appConfig = appConfig; |
89 | 92 |
this.redisConfig = redisConfig; |
93 |
+ this.loginUtil = loginUtil; |
|
90 | 94 |
|
91 | 95 |
this.FRONT_URL = fUrl; |
92 | 96 |
this.JWT_ACCESSTIME = aTime; |
... | ... | @@ -164,16 +168,16 @@ |
164 | 168 |
); |
165 | 169 |
|
166 | 170 |
// 로그인 방식에 따라 필터 적용 (JWT vs 세션) |
167 |
- /* if ("SESSION".equals(authConfig.getLoginType())) { |
|
168 |
- http.addFilterBefore(sessionAuthFilter, LoginFilter.class); // 세션 인증 필터 추가 |
|
171 |
+ if ("S".equals(loginUtil.getLoginMode())) { |
|
172 |
+ http.addFilterBefore(new SessionAuthFilter(jwtUtil, redisTemplate, redisConfig, loginUtil), LoginFilter.class); |
|
169 | 173 |
} else { |
170 |
- http.addFilterBefore(new JWTFilter(jwtUtil, commonConfig, redisConfig, redisTemplate), LoginFilter.class); // JWT 인증 필터 추가 |
|
171 |
- }*/ |
|
174 |
+ http.addFilterBefore(new JWTFilter(jwtUtil, appConfig, loginUtil, redisTemplate), LoginFilter.class); |
|
175 |
+ } |
|
172 | 176 |
|
173 |
- http.addFilterBefore(new JWTFilter(jwtUtil, appConfig, redisConfig, redisTemplate), LoginFilter.class); // 토큰 검증 필터 |
|
177 |
+// http.addFilterBefore(new JWTFilter(jwtUtil, appConfig, redisConfig, redisTemplate), LoginFilter.class); // 토큰 검증 필터 |
|
174 | 178 |
http.addFilterBefore(new AccesFilter(accesCtrlService, httpRequestUtil, appConfig), JWTFilter.class); // 아이피 검증 |
175 | 179 |
http.addFilterAt(new LoginFilter(authenticationManager(authenticationConfiguration), jwtUtil, refreshTokenService, lgnHstryService, httpRequestUtil, |
176 |
- appConfig,redisConfig, JWT_ACCESSTIME, JWT_REFRESHTIME, COOKIE_TIME, redisTemplate), UsernamePasswordAuthenticationFilter.class); // 로그인 필터 |
|
180 |
+ appConfig,loginUtil, JWT_ACCESSTIME, JWT_REFRESHTIME, COOKIE_TIME, redisTemplate), UsernamePasswordAuthenticationFilter.class); // 로그인 필터 |
|
177 | 181 |
|
178 | 182 |
return http.build(); |
179 | 183 |
} |
--- src/main/java/com/takensoft/common/filter/JWTFilter.java
+++ src/main/java/com/takensoft/common/filter/JWTFilter.java
... | ... | @@ -7,6 +7,7 @@ |
7 | 7 |
import com.takensoft.common.exception.FilterExceptionHandler; |
8 | 8 |
import com.takensoft.common.util.ErrorResponse; |
9 | 9 |
import com.takensoft.common.util.JWTUtil; |
10 |
+import com.takensoft.common.util.LoginUtil; |
|
10 | 11 |
import io.jsonwebtoken.ExpiredJwtException; |
11 | 12 |
import io.jsonwebtoken.JwtException; |
12 | 13 |
import org.springframework.data.redis.core.RedisTemplate; |
... | ... | @@ -41,17 +42,17 @@ |
41 | 42 |
private static final String AUTHORIZATION_HEADER = "Authorization"; |
42 | 43 |
private final JWTUtil jwtUtil; |
43 | 44 |
private final AppConfig appConfig; |
44 |
- private final RedisConfig redisConfig; |
|
45 |
+ private final LoginUtil loginUtil; |
|
45 | 46 |
private final RedisTemplate<String, String> redisTemplate; |
46 | 47 |
/** |
47 | 48 |
* @param jwtUtil JWT 유틸리티 클래스의 인스턴스 |
48 | 49 |
* |
49 | 50 |
* JWTFilter 생성자 |
50 | 51 |
*/ |
51 |
- public JWTFilter(JWTUtil jwtUtil, AppConfig appConfig, RedisConfig redisConfig, RedisTemplate<String, String> redisTemplate) { |
|
52 |
+ public JWTFilter(JWTUtil jwtUtil, AppConfig appConfig, LoginUtil loginUtil, RedisTemplate<String, String> redisTemplate) { |
|
52 | 53 |
this.jwtUtil = jwtUtil; |
53 | 54 |
this.appConfig = appConfig; |
54 |
- this.redisConfig = redisConfig; |
|
55 |
+ this.loginUtil = loginUtil; |
|
55 | 56 |
this.redisTemplate = redisTemplate; |
56 | 57 |
} |
57 | 58 |
/** |
... | ... | @@ -101,7 +102,7 @@ |
101 | 102 |
|
102 | 103 |
// 중복 로그인 비허용 설정이면 Redis에서 최신 JWT 가져와 비교 |
103 | 104 |
String userId = (String) jwtUtil.getClaim(accessToken, "mbrId"); |
104 |
- if (!redisConfig.isAllowMultipleLogin()) { |
|
105 |
+ if (!loginUtil.isAllowMultipleLogin()) { |
|
105 | 106 |
String storedToken = redisTemplate.opsForValue().get("jwt:" + userId); |
106 | 107 |
if (storedToken == null) { |
107 | 108 |
} else if (!storedToken.equals(accessToken)) { |
--- src/main/java/com/takensoft/common/filter/LoginFilter.java
+++ src/main/java/com/takensoft/common/filter/LoginFilter.java
... | ... | @@ -8,10 +8,10 @@ |
8 | 8 |
import com.takensoft.cms.mber.vo.MberVO; |
9 | 9 |
import com.takensoft.cms.token.vo.RefreshTknVO; |
10 | 10 |
import com.takensoft.common.config.AppConfig; |
11 |
-import com.takensoft.common.config.RedisConfig; |
|
12 | 11 |
import com.takensoft.common.exception.FilterExceptionHandler; |
13 | 12 |
import com.takensoft.common.util.HttpRequestUtil; |
14 | 13 |
import com.takensoft.common.util.JWTUtil; |
14 |
+import com.takensoft.common.util.LoginUtil; |
|
15 | 15 |
import lombok.SneakyThrows; |
16 | 16 |
import org.springframework.beans.factory.annotation.Value; |
17 | 17 |
import org.springframework.data.redis.core.RedisTemplate; |
... | ... | @@ -50,7 +50,7 @@ |
50 | 50 |
private final LgnHstryService lgnHstryService; |
51 | 51 |
private final HttpRequestUtil httpRequestUtil; |
52 | 52 |
private final AppConfig appConfig; |
53 |
- private final RedisConfig redisConfig; |
|
53 |
+ private final LoginUtil loginUtil; |
|
54 | 54 |
|
55 | 55 |
private static long JWT_ACCESSTIME; // access 토큰 유지 시간 |
56 | 56 |
private static long JWT_REFRESHTIME; // refresh 토큰 유지 시간 |
... | ... | @@ -67,14 +67,14 @@ |
67 | 67 |
* LoginFilter 생성자 |
68 | 68 |
*/ |
69 | 69 |
public LoginFilter(AuthenticationManager authenticationManager, JWTUtil jwtUtil, RefreshTokenService refreshTokenService, LgnHstryService lgnHstryService, HttpRequestUtil httpRequestUtil, |
70 |
- AppConfig appConfig, RedisConfig redisConfig, @Value("${jwt.accessTime}")long aTime, @Value("${jwt.refreshTime}")long rTime, @Value("${cookie.time}")int ctime, RedisTemplate<String, String> redisTemplate) { |
|
70 |
+ AppConfig appConfig, LoginUtil loginUtil, @Value("${jwt.accessTime}")long aTime, @Value("${jwt.refreshTime}")long rTime, @Value("${cookie.time}")int ctime, RedisTemplate<String, String> redisTemplate) { |
|
71 | 71 |
this.authenticationManager = authenticationManager; |
72 | 72 |
this.jwtUtil = jwtUtil; |
73 | 73 |
this.refreshTokenService = refreshTokenService; |
74 | 74 |
this.lgnHstryService = lgnHstryService; |
75 | 75 |
this.httpRequestUtil = httpRequestUtil; |
76 | 76 |
this.appConfig = appConfig; |
77 |
- this.redisConfig = redisConfig; |
|
77 |
+ this.loginUtil = loginUtil; |
|
78 | 78 |
|
79 | 79 |
this.JWT_ACCESSTIME = aTime; |
80 | 80 |
this.JWT_REFRESHTIME = rTime; |
... | ... | @@ -155,7 +155,7 @@ |
155 | 155 |
refreshTokenService.saveRefreshToken(req, res, refresh, JWT_REFRESHTIME); |
156 | 156 |
|
157 | 157 |
// Redis에 AccessToken 저장 (중복 로그인 비허용 설정일 때) |
158 |
- if (!redisConfig.isAllowMultipleLogin()) { |
|
158 |
+ if (!loginUtil.isAllowMultipleLogin()) { |
|
159 | 159 |
redisTemplate.delete("jwt:" + mber.getMbrId()); // 기존 JWT 삭제 |
160 | 160 |
redisTemplate.opsForValue().set("jwt:" + mber.getMbrId(), accessToken, JWT_ACCESSTIME, TimeUnit.MILLISECONDS); |
161 | 161 |
} |
--- src/main/java/com/takensoft/common/filter/SessionAuthFilter.java
+++ src/main/java/com/takensoft/common/filter/SessionAuthFilter.java
... | ... | @@ -1,13 +1,22 @@ |
1 | 1 |
package com.takensoft.common.filter; |
2 | 2 |
|
3 |
+import com.takensoft.cms.mber.vo.MberAuthorVO; |
|
4 |
+import com.takensoft.cms.mber.vo.MberVO; |
|
5 |
+import com.takensoft.common.config.RedisConfig; |
|
3 | 6 |
import com.takensoft.common.util.JWTUtil; |
7 |
+import com.takensoft.common.util.LoginUtil; |
|
4 | 8 |
import jakarta.servlet.FilterChain; |
5 | 9 |
import jakarta.servlet.ServletException; |
6 | 10 |
import jakarta.servlet.http.HttpServletRequest; |
7 | 11 |
import jakarta.servlet.http.HttpServletResponse; |
12 |
+import jakarta.servlet.http.HttpSession; |
|
13 |
+import org.springframework.data.redis.core.RedisTemplate; |
|
14 |
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; |
|
15 |
+import org.springframework.security.core.context.SecurityContextHolder; |
|
8 | 16 |
import org.springframework.web.filter.OncePerRequestFilter; |
9 | 17 |
|
10 | 18 |
import java.io.IOException; |
19 |
+import java.util.List; |
|
11 | 20 |
|
12 | 21 |
/** |
13 | 22 |
* @author takensoft |
... | ... | @@ -23,16 +32,17 @@ |
23 | 32 |
public class SessionAuthFilter extends OncePerRequestFilter { |
24 | 33 |
|
25 | 34 |
private final JWTUtil jwtUtil; |
26 |
- |
|
27 |
- /** |
|
28 |
- * @param jwtUtil JWT 유틸리티 클래스의 인스턴스 |
|
29 |
- * |
|
30 |
- * 세션 Filter 생성자 |
|
31 |
- */ |
|
32 |
- public SessionAuthFilter(JWTUtil jwtUtil) { |
|
35 |
+ private final RedisTemplate<String, String> redisTemplate; |
|
36 |
+ private final RedisConfig redisConfig; |
|
37 |
+ private final LoginUtil loginUtil; |
|
38 |
+ public SessionAuthFilter(JWTUtil jwtUtil, |
|
39 |
+ RedisTemplate<String, String> redisTemplate, |
|
40 |
+ RedisConfig redisConfig, LoginUtil loginUtil) { |
|
33 | 41 |
this.jwtUtil = jwtUtil; |
42 |
+ this.redisTemplate = redisTemplate; |
|
43 |
+ this.redisConfig = redisConfig; |
|
44 |
+ this.loginUtil = loginUtil; |
|
34 | 45 |
} |
35 |
- |
|
36 | 46 |
/** |
37 | 47 |
* @param request HttpServletRequest 객체 |
38 | 48 |
* @param response HttpServletResponse 객체 |
... | ... | @@ -43,10 +53,12 @@ |
43 | 53 |
* 세션 Filter 검증 |
44 | 54 |
*/ |
45 | 55 |
@Override |
46 |
- protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { |
|
47 |
-/* |
|
48 |
- // 현재 로그인 방식 확인 |
|
49 |
- if (!"SESSION".equals(authConfig.getLoginType())) { |
|
56 |
+ protected void doFilterInternal(HttpServletRequest request, |
|
57 |
+ HttpServletResponse response, |
|
58 |
+ FilterChain filterChain) throws ServletException, IOException { |
|
59 |
+ |
|
60 |
+ // JWT 방식이면 이 필터는 동작하지 않음 |
|
61 |
+ if (!"S".equalsIgnoreCase(loginUtil.getLoginMode())) { |
|
50 | 62 |
filterChain.doFilter(request, response); |
51 | 63 |
return; |
52 | 64 |
} |
... | ... | @@ -59,22 +71,35 @@ |
59 | 71 |
|
60 | 72 |
String accessToken = (String) session.getAttribute("JWT_TOKEN"); |
61 | 73 |
|
62 |
- // JWT 검증 |
|
63 |
- if (jwtUtil.isExpired(accessToken)) { |
|
74 |
+ // 토큰 만료 검증 |
|
75 |
+ if ((Boolean) jwtUtil.getClaim(accessToken, "isExpired")) { |
|
64 | 76 |
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Token expired"); |
65 | 77 |
return; |
66 | 78 |
} |
79 |
+ |
|
80 |
+ // 중복 로그인 허용 여부 확인 |
|
81 |
+ if (!loginUtil.isAllowMultipleLogin()) { |
|
82 |
+ String mbrId = (String) jwtUtil.getClaim(accessToken, "mbrId"); |
|
83 |
+ String storedToken = redisTemplate.opsForValue().get("jwt:" + mbrId); |
|
84 |
+ if (storedToken != null && !storedToken.equals(accessToken)) { |
|
85 |
+ response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "다른 기기에서 로그인되었습니다."); |
|
86 |
+ return; |
|
87 |
+ } |
|
88 |
+ } |
|
89 |
+ |
|
90 |
+ // 사용자 인증 정보 SecurityContext에 저장 |
|
67 | 91 |
MberVO mber = new MberVO(); |
68 |
- List<MberAuthorVO> roles = jwtUtil.getRoles(accessToken); |
|
69 |
- mber.setLgnId(jwtUtil.getLgnId(accessToken)); |
|
70 |
- mber.setMbrId(jwtUtil.getMbrId(accessToken)); |
|
92 |
+ List<MberAuthorVO> roles = (List<MberAuthorVO>) jwtUtil.getClaim(accessToken, "roles"); |
|
93 |
+ mber.setLgnId((String) jwtUtil.getClaim(accessToken, "lgnId")); |
|
94 |
+ mber.setMbrId((String) jwtUtil.getClaim(accessToken, "mbrId")); |
|
95 |
+ mber.setMbrNm((String) jwtUtil.getClaim(accessToken, "mbrNm")); |
|
71 | 96 |
mber.setAuthorList(roles); |
72 | 97 |
|
73 |
- // 사용자 정보 추출 후 SecurityContext에 저장 |
|
74 | 98 |
UsernamePasswordAuthenticationToken authentication = |
75 | 99 |
new UsernamePasswordAuthenticationToken(mber, null, mber.getAuthorities()); |
100 |
+ |
|
76 | 101 |
SecurityContextHolder.getContext().setAuthentication(authentication); |
77 | 102 |
|
78 |
- filterChain.doFilter(request, response);*/ |
|
103 |
+ filterChain.doFilter(request, response); |
|
79 | 104 |
} |
80 | 105 |
}(파일 끝에 줄바꿈 문자 없음) |
--- src/main/java/com/takensoft/common/idgen/context/ContextIdgen.java
+++ src/main/java/com/takensoft/common/idgen/context/ContextIdgen.java
... | ... | @@ -158,7 +158,7 @@ |
158 | 158 |
return idgenServiceImpl; |
159 | 159 |
} |
160 | 160 |
|
161 |
- // 중복 로그인 정책 이력 ID |
|
161 |
+ // 중복 로그인 정책 |
|
162 | 162 |
@Bean(name = "loginPolicyIdgn") |
163 | 163 |
public IdgenService loginPolicyIdgn() { |
164 | 164 |
IdgenService idgenServiceImpl = new IdgenService(); |
... | ... | @@ -168,4 +168,14 @@ |
168 | 168 |
idgenServiceImpl.setTblNm("LOGIN_POLICY_ID"); // 시퀀스 테이블명 |
169 | 169 |
return idgenServiceImpl; |
170 | 170 |
} |
171 |
+ // 로그인 방식 |
|
172 |
+ @Bean(name = "loginModeIdgen") |
|
173 |
+ public IdgenService loginModeIdgen() { |
|
174 |
+ IdgenService idgenService = new IdgenService(); |
|
175 |
+ idgenService.setCipers(15); |
|
176 |
+ idgenService.setFillChar('0'); |
|
177 |
+ idgenService.setPrefix("LOGIN_MODE_"); |
|
178 |
+ idgenService.setTblNm("LOGIN_MODE_ID"); |
|
179 |
+ return idgenService; |
|
180 |
+ } |
|
171 | 181 |
}(파일 끝에 줄바꿈 문자 없음) |
+++ src/main/java/com/takensoft/common/util/LoginUtil.java
... | ... | @@ -0,0 +1,55 @@ |
1 | +package com.takensoft.common.util; | |
2 | + | |
3 | +import com.takensoft.cms.loginPolicy.service.LoginModeService; | |
4 | +import com.takensoft.cms.loginPolicy.service.LoginPolicyService; | |
5 | +import org.springframework.stereotype.Component; | |
6 | + | |
7 | +/** | |
8 | + * @author : takensoft | |
9 | + * @since : 2025.01.22 | |
10 | + * @modification | |
11 | + * since | author | description | |
12 | + * 2025.01.22 | takensoft | 최초 등록 | |
13 | + * | |
14 | + * 중복로그인, 로그인 방식 등의 유틸리티 | |
15 | + */ | |
16 | +@Component | |
17 | +public class LoginUtil { | |
18 | + | |
19 | + | |
20 | + private final LoginPolicyService loginPolicyService; | |
21 | + private final LoginModeService loginModeService; | |
22 | + /** | |
23 | + * | |
24 | + * 기본 생성자 | |
25 | + * @param loginPolicyService | |
26 | + * @param loginModeService | |
27 | + */ | |
28 | + public LoginUtil(LoginPolicyService loginPolicyService, LoginModeService loginModeService) { | |
29 | + this.loginPolicyService = loginPolicyService; | |
30 | + this.loginModeService = loginModeService; | |
31 | + } | |
32 | + | |
33 | + /** | |
34 | + * @return allowMultipleLogin - 중복로그인 허용/비허용 반환 | |
35 | + * | |
36 | + * 중복 로그인 허용 여부를 반환하는 메서드 | |
37 | + */ | |
38 | + public boolean isAllowMultipleLogin() { | |
39 | + Boolean result = loginPolicyService.getPolicy(); | |
40 | + return result; | |
41 | + } | |
42 | + | |
43 | + /** | |
44 | + * @return allowMultipleLogin - 중복로그인 허용/비허용 반환 | |
45 | + * | |
46 | + * 중복 로그인 허용 여부를 반환하는 메서드 | |
47 | + */ | |
48 | + public String getLoginMode() { | |
49 | + String result = loginModeService.getLoginMode(); | |
50 | + return result; | |
51 | + } | |
52 | + | |
53 | + | |
54 | + | |
55 | +} |
+++ src/main/resources/mybatis/mapper/loginPolicy/loginMode-SQL.xml
... | ... | @@ -0,0 +1,40 @@ |
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |
3 | +<!-- | |
4 | + 작성자 : 김혜민 | |
5 | + 작성일 : 2025.03.22 | |
6 | + 내 용 : 로그인 방식 설정 관련 | |
7 | +--> | |
8 | +<mapper namespace="com.takensoft.cms.loginPolicy.dao.LoginModeDAO"> | |
9 | + | |
10 | + <!-- | |
11 | + 작성자 : 김혜민 | |
12 | + 작성일 : 2025.03.22 | |
13 | + 내 용 : 로그인 방식 설정 최신값 조회 | |
14 | + --> | |
15 | + <select id="selectLatestLoginMode" resultType="String"> | |
16 | + SELECT lgn_mode | |
17 | + FROM lgn_mode_hstry | |
18 | + ORDER BY reg_dt DESC | |
19 | + LIMIT 1 | |
20 | + </select> | |
21 | + | |
22 | + <!-- | |
23 | + 작성자 : 김혜민 | |
24 | + 작성일 : 2025.03.22 | |
25 | + 내 용 : 로그인 방식 설정 등록 | |
26 | + --> | |
27 | + <insert id="insertLoginMode" parameterType="LoginModeVO"> | |
28 | + INSERT INTO lgn_mode_hstry ( | |
29 | + lgn_mode_id, | |
30 | + lgn_mode, | |
31 | + rgtr_id, | |
32 | + reg_dt | |
33 | + ) VALUES ( | |
34 | + #{lgnModeId}, | |
35 | + #{lgnMode}, | |
36 | + #{rgtrId}, | |
37 | + NOW() | |
38 | + ) | |
39 | + </insert> | |
40 | +</mapper>(파일 끝에 줄바꿈 문자 없음) |
--- src/main/resources/mybatis/mapper/loginPolicy/loginPolicy-SQL.xml
+++ src/main/resources/mybatis/mapper/loginPolicy/loginPolicy-SQL.xml
... | ... | @@ -14,7 +14,7 @@ |
14 | 14 |
--> |
15 | 15 |
<select id="selectLatestPolicy" resultType="String"> |
16 | 16 |
SELECT allow_multiple_login |
17 |
- FROM login_policy_history |
|
17 |
+ FROM lgn_policy_hstry |
|
18 | 18 |
ORDER BY reg_dt DESC |
19 | 19 |
LIMIT 1 |
20 | 20 |
</select> |
... | ... | @@ -25,7 +25,7 @@ |
25 | 25 |
내 용 : 중복로그인 여부 등록 |
26 | 26 |
--> |
27 | 27 |
<insert id="insertPolicy" parameterType="LoginPolicyVO"> |
28 |
- INSERT INTO login_policy_history ( |
|
28 |
+ INSERT INTO lgn_policy_hstry ( |
|
29 | 29 |
policy_id, |
30 | 30 |
allow_multiple_login, |
31 | 31 |
rgtr, |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?