하석형 하석형 05-27
250527 하석형 관리자 페이지 로그인 -> 관리자계정 로그인 시 2차 인증 로직으로 변경
@e383166f1ecd4c6357971feb0a12017494dd496a
src/main/java/com/takensoft/common/config/SecurityConfig.java
--- src/main/java/com/takensoft/common/config/SecurityConfig.java
+++ src/main/java/com/takensoft/common/config/SecurityConfig.java
@@ -4,15 +4,12 @@
 import com.takensoft.cms.cntxtPth.service.CntxtPthService;
 import com.takensoft.cms.loginPolicy.service.LoginModeService;
 import com.takensoft.cms.loginPolicy.service.LoginPolicyService;
-import com.takensoft.cms.mber.service.LgnHstryService;
-import com.takensoft.cms.token.service.RefreshTokenService;
 import com.takensoft.common.filter.*;
 import com.takensoft.common.util.HttpRequestUtil;
 import com.takensoft.common.exception.CustomAccessDenieHandler;
 import com.takensoft.common.exception.CustomAuthenticationEntryPoint;
 import com.takensoft.common.util.JWTUtil;
 import com.takensoft.common.util.LoginUtil;
-import com.takensoft.common.util.SessionUtil;
 import com.takensoft.common.verify.service.Impl.EmailServiceImpl;
 import com.takensoft.common.oauth.service.Impl.CustomOAuth2UserServiceImpl;
 import com.takensoft.common.oauth.handler.OAuth2AuthenticationSuccessHandler;
@@ -28,7 +25,6 @@
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 import org.springframework.security.config.http.SessionCreationPolicy;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
 import org.springframework.security.web.SecurityFilterChain;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 import org.springframework.security.web.context.SecurityContextPersistenceFilter;
@@ -56,8 +52,6 @@
     // AuthenticationManager가 인자로 받을 AuthenticationConfiguration 객체 생성자 주입
     private final AuthenticationConfiguration authenticationConfiguration;
     private final JWTUtil jwtUtil;
-    private final RefreshTokenService refreshTokenService;
-    private final LgnHstryService lgnHstryService;
     private final CntxtPthService cntxtPthService;
     private final AccesCtrlService accesCtrlService;
     private final CustomAuthenticationEntryPoint authenticationEntryPoint;
@@ -67,7 +61,6 @@
     private final LoginModeService loginModeService;
     private final LoginPolicyService loginPolicyService;
     private final EmailServiceImpl emailServiceImpl;
-    private final SessionUtil sessionUtil;
     private final LoginUtil loginUtil;
 
     @Autowired
@@ -80,22 +73,15 @@
     private OAuth2AuthenticationFailureHandler oAuth2AuthenticationFailureHandler;
 
     private static String FRONT_URL;    // 프론트 접근 허용 URL
-    private static long JWT_ACCESSTIME; // access 토큰 유지 시간
-    private static long JWT_REFRESHTIME; // refresh 토큰 유지 시간
-    private static int COOKIE_TIME; // 쿠키 유지 시간
 
     private final RedisTemplate<String, String> redisTemplate;
 
     /**
      * SecurityConfig 생성자
      */
-    public SecurityConfig(AuthenticationConfiguration authenticationConfiguration, JWTUtil jwtUtil, RefreshTokenService refreshTokenService, CntxtPthService cntxtPthService, AccesCtrlService accesCtrlService, AppConfig appConfig,
-                          LgnHstryService lgnHstryService, CustomAuthenticationEntryPoint authenticationEntryPoint, CustomAccessDenieHandler accessDenieHandler, HttpRequestUtil httpRequestUtil,
-                          LoginModeService loginModeService, LoginPolicyService loginPolicyService, EmailServiceImpl emailServiceImpl, SessionUtil sessionUtil, @Value("${front.url}") String fUrl, @Value("${jwt.accessTime}") long aTime, @Value("${jwt.refreshTime}") long rTime, @Value("${cookie.time}") int ctime, RedisTemplate<String, String> redisTemplate,
-                          LoginUtil loginUtil) {
+    public SecurityConfig(AuthenticationConfiguration authenticationConfiguration, JWTUtil jwtUtil, CntxtPthService cntxtPthService, AccesCtrlService accesCtrlService, AppConfig appConfig, CustomAuthenticationEntryPoint authenticationEntryPoint, CustomAccessDenieHandler accessDenieHandler,
+                          HttpRequestUtil httpRequestUtil, LoginModeService loginModeService, LoginPolicyService loginPolicyService, EmailServiceImpl emailServiceImpl, @Value("${front.url}") String fUrl, RedisTemplate<String, String> redisTemplate, LoginUtil loginUtil) {
         this.authenticationConfiguration = authenticationConfiguration;
-        this.refreshTokenService = refreshTokenService;
-        this.lgnHstryService = lgnHstryService;
         this.cntxtPthService = cntxtPthService;
         this.accesCtrlService = accesCtrlService;
         this.authenticationEntryPoint = authenticationEntryPoint;
@@ -106,11 +92,7 @@
         this.loginModeService = loginModeService;
         this.loginPolicyService = loginPolicyService;
         this.emailServiceImpl = emailServiceImpl;
-        this.sessionUtil = sessionUtil;
         this.FRONT_URL = fUrl;
-        this.JWT_ACCESSTIME = aTime;
-        this.JWT_REFRESHTIME = rTime;
-        this.COOKIE_TIME = ctime;
         this.redisTemplate = redisTemplate;
         this.loginUtil = loginUtil;
     }
@@ -207,9 +189,7 @@
         http.addFilterBefore(new AccesFilter(accesCtrlService, httpRequestUtil, appConfig), JWTFilter.class);
 
         // 로그인 필터
-        http.addFilterAt(new LoginFilter(authenticationManager(authenticationConfiguration), jwtUtil, refreshTokenService, lgnHstryService, httpRequestUtil,
-                 loginModeService, loginPolicyService, emailServiceImpl, sessionUtil, JWT_ACCESSTIME, JWT_REFRESHTIME, COOKIE_TIME, redisTemplate,
-                loginUtil), UsernamePasswordAuthenticationFilter.class);
+        http.addFilterAt(new LoginFilter(authenticationManager(authenticationConfiguration), emailServiceImpl, loginUtil), UsernamePasswordAuthenticationFilter.class);
 
 
         return http.build();
src/main/java/com/takensoft/common/filter/LoginFilter.java
--- src/main/java/com/takensoft/common/filter/LoginFilter.java
+++ src/main/java/com/takensoft/common/filter/LoginFilter.java
@@ -1,25 +1,13 @@
 package com.takensoft.common.filter;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.takensoft.cms.loginPolicy.service.LoginModeService;
-import com.takensoft.cms.loginPolicy.service.LoginPolicyService;
 import com.takensoft.cms.mber.dto.LoginDTO;
-import com.takensoft.cms.mber.service.LgnHstryService;
-import com.takensoft.cms.token.service.RefreshTokenService;
-import com.takensoft.cms.mber.vo.LgnHstryVO;
 import com.takensoft.cms.mber.vo.MberVO;
-import com.takensoft.cms.token.vo.RefreshTknVO;
 import com.takensoft.common.exception.FilterExceptionHandler;
-import com.takensoft.common.util.HttpRequestUtil;
-import com.takensoft.common.util.JWTUtil;
 import com.takensoft.common.util.LoginUtil;
-import com.takensoft.common.util.SessionUtil;
 import com.takensoft.common.verify.service.Impl.EmailServiceImpl;
 import com.takensoft.common.verify.vo.EmailVO;
-import jakarta.servlet.http.HttpSession;
 import lombok.SneakyThrows;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -34,9 +22,7 @@
 import jakarta.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
-import java.util.concurrent.TimeUnit;
 
 /**
  * @author takensoft
@@ -52,46 +38,14 @@
 public class LoginFilter extends UsernamePasswordAuthenticationFilter {
 
     private final AuthenticationManager authenticationManager;
-    private final JWTUtil jwtUtil;
-    private final RefreshTokenService refreshTokenService;
-    private final LgnHstryService lgnHstryService;
-    private final HttpRequestUtil httpRequestUtil;
-    private final LoginModeService loginModeService;
-    private final LoginPolicyService loginPolicyService;
     private final EmailServiceImpl emailServiceImpl;
-    private final SessionUtil sessionUtil;
     private final LoginUtil loginUtil;
-
-    private static long JWT_ACCESSTIME; // access 토큰 유지 시간
-    private static long JWT_REFRESHTIME; // refresh 토큰 유지 시간
-    private static int COOKIE_TIME; // 쿠키 유지 시간
-
-    private final RedisTemplate<String, String> redisTemplate;
     /**
-     * @param aTime - 액세스 토큰의 유효 시간 (application.yml에서 값을 읽어 옴)
-     * @param rTime - 리프레시 토큰의 유효 시간 (application.yml에서 값을 읽어 옴)
-     * @param ctime - 쿠키의 유효 시간 (application.yml에서 값을 읽어 옴)
-     * @param authenticationManager - 인증 관리자
-     * @param jwtUtil - JWT 유틸리티
-     *
      * LoginFilter 생성자
      */
-    public LoginFilter(AuthenticationManager authenticationManager, JWTUtil jwtUtil, RefreshTokenService refreshTokenService, LgnHstryService lgnHstryService, HttpRequestUtil httpRequestUtil,
-                       LoginModeService loginModeService,LoginPolicyService loginPolicyService, EmailServiceImpl emailServiceImpl, SessionUtil sessionUtil, @Value("${jwt.accessTime}")long aTime, @Value("${jwt.refreshTime}")long rTime, @Value("${cookie.time}")int ctime, RedisTemplate<String, String> redisTemplate,
-                       LoginUtil loginUtil) {
+    public LoginFilter(AuthenticationManager authenticationManager, EmailServiceImpl emailServiceImpl, LoginUtil loginUtil) {
         this.authenticationManager = authenticationManager;
-        this.jwtUtil = jwtUtil;
-        this.refreshTokenService = refreshTokenService;
-        this.lgnHstryService = lgnHstryService;
-        this.httpRequestUtil = httpRequestUtil;
-        this.loginModeService = loginModeService;
-        this.loginPolicyService = loginPolicyService;
         this.emailServiceImpl = emailServiceImpl;
-        this.sessionUtil = sessionUtil;
-        this.JWT_ACCESSTIME = aTime;
-        this.JWT_REFRESHTIME = rTime;
-        this.COOKIE_TIME = ctime;
-        this.redisTemplate = redisTemplate;
         this.loginUtil = loginUtil;
 
         this.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/mbr/loginProc.json","POST"));
@@ -138,98 +92,36 @@
         Map<String, Object> result = new HashMap<>();
 
         MberVO mber = (MberVO) authentication.getPrincipal();
+        boolean isAdmin = mber.getAuthorities().stream().anyMatch(role -> role.getAuthority().equals("ROLE_ADMIN")); // 관리자 권한 여부
+        String lgnReqPage = (String) req.getAttribute("lgnReqPage"); // 로그인 요청 페이지 정보 (A: 관리자, U: 사용자)
 
-        String lgnReqPage = (String) req.getAttribute("lgnReqPage");
-        // 로그인 요청 페이지가 관리자 페이지일 경우
-        if("A".equals(lgnReqPage)) {
-            // 관리자 권한이 있는지 확인
-            if(mber.getAuthorities().stream().anyMatch(role -> role.getAuthority().equals("ROLE_ADMIN"))) {
-                EmailVO emailVO = new EmailVO().builder()
-                        .email(mber.getEml())
-                        .build();
-                emailServiceImpl.sendEmailVerifyCode(emailVO);
-                res.setContentType("application/json;charset=UTF-8");
-                res.setStatus(HttpStatus.OK.value());
-                result.put("mbrId", mber.getMbrId());
-                result.put("email", mber.getEml());
+        // 관리자일 경우 2차 인증(이메일 인증) 코드 발송
+        if(isAdmin) {
+            EmailVO emailVO = new EmailVO().builder()
+                    .email(mber.getEml())
+                    .build();
+            emailServiceImpl.sendEmailVerifyCode(emailVO);
+            res.setContentType("application/json;charset=UTF-8");
+            res.setStatus(HttpStatus.OK.value());
+            result.put("mbrId", mber.getMbrId());
+            result.put("email", mber.getEml());
 
-                res.setContentType("application/json;charset=UTF-8");
-                res.setStatus(HttpStatus.OK.value());
+            res.setContentType("application/json;charset=UTF-8");
+            res.setStatus(HttpStatus.OK.value());
 
-                new ObjectMapper().writeValue(res.getOutputStream(), result);
-            } else {
-                // 관리자 권한이 없는 경우 접근 권한이 없습니다
+            new ObjectMapper().writeValue(res.getOutputStream(), result);
+        // 사용자일 경우
+        } else {
+            // 사용자가 관리자 로그인 페이지로 접근할 경우
+            if("A".equals(lgnReqPage)) {
                 res.setContentType("application/json;charset=UTF-8");
                 res.setStatus(HttpStatus.FORBIDDEN.value());
 
                 result.put("message", "접근 권한이 없습니다.");
                 new ObjectMapper().writeValue(res.getOutputStream(), result);
+            } else {
+                loginUtil.successLogin(mber, req, res); // 로그인 성공 처리
             }
-        } else {
-            loginUtil.successLogin(mber, req, res);
-//            // 로그인 이력 등록
-//            LgnHstryVO lgnHstryVO = new LgnHstryVO();
-//            lgnHstryVO.setLgnId(mber.getLgnId());
-//            if (mber.getAuthorities().stream().anyMatch(role -> role.getAuthority().equals("ROLE_ADMIN"))) {
-//                lgnHstryVO.setLgnType("0");
-//            } else {
-//                lgnHstryVO.setLgnType("1");
-//            }
-//            lgnHstryVO.setCntnIp(httpRequestUtil.getIp(req));
-//            lgnHstryVO.setCntnOperSys(httpRequestUtil.getOS(httpRequestUtil.getUserAgent(req)));
-//            lgnHstryVO.setDeviceNm(httpRequestUtil.getDevice(httpRequestUtil.getUserAgent(req)));
-//            lgnHstryVO.setBrwsrNm(httpRequestUtil.getBrowser(httpRequestUtil.getUserAgent(req)));
-//            lgnHstryService.LgnHstrySave(lgnHstryVO);
-//
-//            // 로그인 방식 확인 JWT or SESSION
-//            String loginType = loginModeService.getLoginMode();
-//
-//            // 토큰 생성(access, refresh)
-//            String accessToken = jwtUtil.createJwt("Authorization", mber.getMbrId(), mber.getLgnId(), mber.getMbrNm(), (List) mber.getAuthorities(), JWT_ACCESSTIME);
-//            String refreshToken = jwtUtil.createJwt("refresh", mber.getMbrId(), mber.getLgnId(), mber.getMbrNm(), (List) mber.getAuthorities(), JWT_REFRESHTIME);
-//
-//            // refreshToken이 현재 IP와 계정으로 등록되어 있는지 확인
-//            RefreshTknVO refresh = new RefreshTknVO();
-//            refresh.setMbrId(mber.getMbrId());
-//
-//            // refresh 토큰이 현재 아이피와 아이디로 DB에 등록 되어 있다면
-//            if (refreshTokenService.findByCheckRefresh(req, refresh)) {
-//                refreshTokenService.delete(req, refresh);
-//            }
-//            // refreshToken DB 저장
-//            refresh.setToken(refreshToken);
-//
-//
-//            if (loginType.equals("S")) {
-//                HttpSession session = req.getSession(true);
-//                session.setAttribute("JWT_TOKEN", accessToken);
-//
-//                // 중복 로그인 비허용일 때 기존 세션 만료
-//                if (!loginPolicyService.getPolicy()) {
-//                    sessionUtil.registerSession(mber.getMbrId(), session);
-//                }
-//                Map<String, Object> result = new HashMap<>();
-//                result.put("mbrId", mber.getMbrId());
-//                result.put("mbrNm", mber.getMbrNm());
-//                result.put("roles", mber.getAuthorList());
-//
-//                res.setContentType("application/json;charset=UTF-8");
-//                res.setStatus(HttpStatus.OK.value());
-//
-//                ObjectMapper mapper = new ObjectMapper();
-//                res.getOutputStream().write(mapper.writeValueAsBytes(result));
-//            } else {
-//                res.setHeader("Authorization", accessToken);
-//                res.addCookie(jwtUtil.createCookie("refresh", refreshToken, COOKIE_TIME));
-//
-//                // 중복 로그인 비허용일 때 Redis 저장
-//                if (!loginPolicyService.getPolicy()) {
-//                    redisTemplate.delete("jwt:" + mber.getMbrId());
-//                    redisTemplate.opsForValue().set("jwt:" + mber.getMbrId(), accessToken, JWT_ACCESSTIME, TimeUnit.MILLISECONDS);
-//                }
-//            }
-//            refreshTokenService.saveRefreshToken(req, res, refresh, JWT_REFRESHTIME);
-//            res.setHeader("login-type", loginType);
         }
     }
 
src/main/java/com/takensoft/common/util/LoginUtil.java
--- src/main/java/com/takensoft/common/util/LoginUtil.java
+++ src/main/java/com/takensoft/common/util/LoginUtil.java
@@ -36,11 +36,11 @@
     private final RedisTemplate<String, String> redisTemplate;
 
     @Value("${jwt.accessTime}")
-    private long JWT_ACCESSTIME;
+    private long JWT_ACCESSTIME; // access 토큰 유지 시간
     @Value("${jwt.refreshTime}")
-    private long JWT_REFRESHTIME;
+    private long JWT_REFRESHTIME; // refresh 토큰 유지 시간
     @Value("${cookie.time}")
-    private int COOKIE_TIME;
+    private int COOKIE_TIME; // 쿠키 유지 시간
 
     public void successLogin(MberVO mber, HttpServletRequest req, HttpServletResponse res) {
         try {
Add a comment
List