로그인로그 생성 작업중.

thkim
강석 최 2024-02-27 13:24:54 +09:00
parent 71e513dd68
commit 4b9d5a065f
10 changed files with 146 additions and 10 deletions

View File

@ -67,7 +67,7 @@ function UserInfoModal({savedInfo, reloadFunction}){
}
},
(resp) => {
debugger
}
)
}

View File

@ -0,0 +1,44 @@
package com.dbnt.kcscbackend.admin.logs.entity;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Getter
@Setter
@Accessors(chain = true)
@Entity
@NoArgsConstructor
@DynamicInsert
@DynamicUpdate
@Table(name = "th_login_log")
public class ThLoginLog {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ll_seq")
private Long llSeq;
@Column(name = "user_id")
private String userId;
@Column(name = "access_dt")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime accessDt;
@Column(name = "ip_address")
private String ipAddress;
@Column(name = "session_id")
private String sessionId;
@Column(name = "access_type")
private String accessType;
}

View File

@ -10,7 +10,6 @@ import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.time.LocalDate;
import java.awt.*;
@Getter
@Setter
@ -22,13 +21,20 @@ import java.awt.*;
@Table(name = "tn_daily_user_log")
public class TnDailyUserConnLog {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "dul_seq")
private Long dulSeq;
@Column(name = "log_cnt")
private Long logCnt;
@Column(name = "log_dt")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate logDt;
@Column(name = "log_cnt")
private Long logCnt;
@Column(name = "mobile_cnt")
private Long mobileCnt;
@Column(name = "pc_cnt")
private Long pcCnt;
}

View File

@ -5,6 +5,6 @@ import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface PrivacyLogsRepository extends JpaRepository<ThPrivacyLog, String> {
public interface PrivacyLogsRepository extends JpaRepository<ThPrivacyLog, Long> {
List<ThPrivacyLog> findAllByOrderByUplSeqDesc();
}

View File

@ -0,0 +1,12 @@
package com.dbnt.kcscbackend.admin.logs.repository;
import com.dbnt.kcscbackend.admin.logs.entity.ThLoginLog;
import org.springframework.data.jpa.repository.JpaRepository;
import java.time.LocalDateTime;
import java.util.List;
public interface ThLoginLogRepository extends JpaRepository<ThLoginLog, Long> {
List<ThLoginLog> findByUserIdAndAccessDtAfter(String userId, LocalDateTime accessDt);
}

View File

@ -5,7 +5,9 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
public interface UserLogsRepository extends JpaRepository<TnDailyUserConnLog, Long> {
@ -21,5 +23,5 @@ public interface UserLogsRepository extends JpaRepository<TnDailyUserConnLog, Lo
+ "ORDER BY log_dt asc", nativeQuery = true)
List<Object[]> selectCountUser(@Param("startDate") String startDate, @Param("endDate") String endDate);
Optional<TnDailyUserConnLog> findByLogDt(LocalDate logDt);
}

View File

@ -1,13 +1,18 @@
package com.dbnt.kcscbackend.admin.logs.service;
import com.dbnt.kcscbackend.admin.logs.entity.ThLoginLog;
import com.dbnt.kcscbackend.admin.logs.entity.ThPrivacyLog;
import com.dbnt.kcscbackend.admin.logs.entity.TnDailyUserConnLog;
import com.dbnt.kcscbackend.admin.logs.repository.PrivacyLogsRepository;
import com.dbnt.kcscbackend.admin.logs.repository.ThLoginLogRepository;
import com.dbnt.kcscbackend.admin.logs.repository.UserLogsRepository;
import lombok.RequiredArgsConstructor;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -17,6 +22,8 @@ import java.util.Map;
public class AdminLogsService extends EgovAbstractServiceImpl {
private final PrivacyLogsRepository privacyLogsRepository;
private final ThLoginLogRepository loginLogRepository;
private final UserLogsRepository userLogsRepository;
public Map<String, Object> selectPrivacyList() {
Map<String, Object> resultMap = new HashMap<>();
@ -46,4 +53,44 @@ public class AdminLogsService extends EgovAbstractServiceImpl {
log.setTargetUserId(targetUserId);
privacyLogsRepository.save(log);
}
@Transactional
public void insertLoginLog(String userId, String ipAddress, String accessToken, String accessType, String webType){
ThLoginLog loginLog = new ThLoginLog();
loginLog.setUserId(userId);
loginLog.setIpAddress(ipAddress);
loginLog.setSessionId(accessToken);
loginLog.setAccessType(accessType);
loginLog.setAccessDt(LocalDateTime.now());
loginLogRepository.save(loginLog);
// 로그인 기록이면 tn_daily_yser_log 카운트 조정
if(accessType.equals("Y")){
//오늘 일자 로그 조회
TnDailyUserConnLog userConnLog = userLogsRepository.findByLogDt(LocalDate.now()).orElse(null);
if(userConnLog==null){
userConnLog = new TnDailyUserConnLog();
userConnLog.setLogDt(LocalDate.now());
userConnLog.setLogCnt(0L);
userConnLog.setMobileCnt(0L);
userConnLog.setPcCnt(0L);
}
if(webType.equals("PC")){
userConnLog.setPcCnt(userConnLog.getPcCnt()+1);
}else{
userConnLog.setMobileCnt(userConnLog.getMobileCnt()+1);
}
//같은 일자 로그인 기록 확인
LocalDateTime now = LocalDateTime.now();
now = now.minusHours(now.getHour());
now = now.minusMinutes(now.getMinute());
now = now.minusSeconds(now.getSecond());
List<ThLoginLog> todayLoginLog = loginLogRepository.findByUserIdAndAccessDtAfter(userId, now);
if(todayLoginLog.size()==0){
userConnLog.setLogCnt(userConnLog.getLogCnt()+1);
}
userLogsRepository.save(userConnLog);
}
}
}

View File

@ -1,5 +1,6 @@
package com.dbnt.kcscbackend.config.security;
import com.dbnt.kcscbackend.admin.logs.service.AdminLogsService;
import com.dbnt.kcscbackend.auth.entity.UserInfo;
import com.dbnt.kcscbackend.config.common.ResponseCode;
import com.dbnt.kcscbackend.config.egov.EgovProperties;
@ -31,6 +32,7 @@ import java.util.List;
public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
private final EgovJwtTokenUtil jwtTokenUtil;
private final AdminLogsService adminLogsService;
private RequestCache requestCache = new HttpSessionRequestCache();
private static final List<String> adminIpList = Arrays.asList(EgovProperties.getProperty("Globals.admin.allow-ip").split(","));
@ -53,12 +55,14 @@ public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticati
securityUser = (UserInfo) principal;
}
}
String accessIp = ClientUtils.getRemoteIP(request);
// application/json(ajax) 요청일 경우 아래의 처리!
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
MediaType jsonMimeType = MediaType.APPLICATION_JSON;
HashMap<String, Object> resultMap = new HashMap<>();
/*if(securityUser.getUserId().equals("admin") && !adminIpList.contains(ClientUtils.getRemoteIP(request))){
/*if(securityUser.getUserId().equals("admin") && !adminIpList.contains(accessIp)){
resultMap.put("resultCode", ResponseCode.FAILED.getCode());
resultMap.put("resultMessage", "관리자 계정은 지정된 아이피에서만 접속할 수 있습니다.\n필요한 경우 관리자에게 요청하십시오.\n접속자 아이피: "+ClientUtils.getRemoteIP(request));
}else{
@ -78,6 +82,9 @@ public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticati
resultMap.put("accessToken", accessToken);
resultMap.put("refreshToken", refreshToken);
//로그인 로그 기록
adminLogsService.insertLoginLog(securityUser.getUserId(), accessIp, accessToken, "Y", ClientUtils.getWebType(request));
if (jsonConverter.canWrite(resultMap.getClass(), jsonMimeType)) {
jsonConverter.write(resultMap, jsonMimeType, new ServletServerHttpResponse(response));
}

View File

@ -1,5 +1,6 @@
package com.dbnt.kcscbackend.config.security;
import com.dbnt.kcscbackend.admin.logs.service.AdminLogsService;
import com.dbnt.kcscbackend.config.jwt.EgovJwtTokenUtil;
import com.dbnt.kcscbackend.config.jwt.JwtAuthenticationEntryPoint;
import com.dbnt.kcscbackend.config.jwt.JwtAuthenticationFilter;
@ -49,6 +50,7 @@ public class SecurityConfig {
private UserDetailsService loginService;
private final ObjectMapper objectMapper;
private final EgovJwtTokenUtil egovJwtTokenUtil;
private final AdminLogsService adminLogsService;
//Http Methpd : Get 인증예외 List
private String[] AUTH_GET_WHITELIST = {
@ -145,7 +147,7 @@ public class SecurityConfig {
@Bean
public JsonAuthenticationFilter jsonUsernamePasswordAuthenticationFilter() {
JsonAuthenticationFilter jsonAuthenticationFilter = new JsonAuthenticationFilter(objectMapper, new CustomUrlAuthenticationSuccessHandler(egovJwtTokenUtil), loginFailureHandler());
JsonAuthenticationFilter jsonAuthenticationFilter = new JsonAuthenticationFilter(objectMapper, new CustomUrlAuthenticationSuccessHandler(egovJwtTokenUtil, adminLogsService), loginFailureHandler());
jsonAuthenticationFilter.setAuthenticationManager(authenticationManager());
return jsonAuthenticationFilter;
}

View File

@ -29,4 +29,20 @@ public class ClientUtils {
return ip;
}
public static String getWebType(HttpServletRequest request) {
String filter = "iphone|ipod|android|windows ce|blackberry|symbian|windows phone|webos|opera mini|opera mobi|polaris|iemobile|lgtelecom|nokia|sonyericsson|lg|samsung";
String filters[] = filter.split("\\|");
String webType = "";
for(String tmp : filters){
if (request.getHeader("User-Agent").toLowerCase().contains(tmp)) {
webType = "MOBILE";
break;
} else {
webType = "PC";
}
}
return webType;
}
}