diff --git a/src/main/java/com/kamco/cd/kamcoback/config/FileDownloadInteceptor.java b/src/main/java/com/kamco/cd/kamcoback/config/FileDownloadInteceptor.java index 506d6477..c800c690 100644 --- a/src/main/java/com/kamco/cd/kamcoback/config/FileDownloadInteceptor.java +++ b/src/main/java/com/kamco/cd/kamcoback/config/FileDownloadInteceptor.java @@ -2,6 +2,7 @@ package com.kamco.cd.kamcoback.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.kamco.cd.kamcoback.auth.CustomUserDetails; +import com.kamco.cd.kamcoback.common.utils.HeaderUtil; import com.kamco.cd.kamcoback.config.api.ApiLogFunction; import com.kamco.cd.kamcoback.menu.dto.MenuDto; import com.kamco.cd.kamcoback.menu.service.MenuService; @@ -13,6 +14,7 @@ import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Objects; +import java.util.UUID; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -74,7 +76,8 @@ public class FileDownloadInteceptor implements HandlerInterceptor { request.getRequestURI(), Objects.requireNonNull(basic).getMenuUid(), ip, - response.getStatus()); + response.getStatus(), + UUID.fromString(HeaderUtil.get(request, "kamco-download-uuid"))); auditLogRepository.save(log); } diff --git a/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseAdvice.java b/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseAdvice.java index 41076e3f..1dfb2669 100644 --- a/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseAdvice.java +++ b/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseAdvice.java @@ -2,6 +2,8 @@ package com.kamco.cd.kamcoback.config.api; import com.fasterxml.jackson.databind.ObjectMapper; import com.kamco.cd.kamcoback.auth.CustomUserDetails; +import com.kamco.cd.kamcoback.common.utils.HeaderUtil; +import com.kamco.cd.kamcoback.log.dto.EventType; import com.kamco.cd.kamcoback.menu.dto.MenuDto; import com.kamco.cd.kamcoback.menu.service.MenuService; import com.kamco.cd.kamcoback.postgres.entity.AuditLogEntity; @@ -66,12 +68,24 @@ public class ApiResponseAdvice implements ResponseBodyAdvice { if (body instanceof ApiResponseDto apiResponse) { response.setStatusCode(apiResponse.getHttpStatus()); - String ip = ApiLogFunction.getXFowardedForIp(servletRequest); - Long userid = null; + String actionType = HeaderUtil.get(servletRequest, "kamco-action-type"); + if (actionType == null) { // actionType 이 없으면 로그 저장하지 않기 + return body; + } - if (servletRequest.getUserPrincipal() instanceof UsernamePasswordAuthenticationToken auth - && auth.getPrincipal() instanceof CustomUserDetails customUserDetails) { - userid = customUserDetails.getMember().getId(); + String ip = ApiLogFunction.getXFowardedForIp(servletRequest); + // String ip = HeaderUtil.get(servletRequest, "kamco-user-ip"); + Long userid = null; + String loginAttemptId = null; + + // 로그인 시도할 때 + if (servletRequest.getRequestURI().contains("/api/auth/signin")) { + loginAttemptId = HeaderUtil.get(servletRequest, "kamco-login-attempt-id"); + } else { + if (servletRequest.getUserPrincipal() instanceof UsernamePasswordAuthenticationToken auth + && auth.getPrincipal() instanceof CustomUserDetails customUserDetails) { + userid = customUserDetails.getMember().getId(); + } } String requestBody; @@ -107,13 +121,15 @@ public class ApiResponseAdvice implements ResponseBodyAdvice { AuditLogEntity log = new AuditLogEntity( userid, - ApiLogFunction.getEventType(servletRequest), + EventType.fromName(actionType), ApiLogFunction.isSuccessFail(apiResponse), ApiLogFunction.getUriMenuInfo(result, servletRequest.getRequestURI()), ip, servletRequest.getRequestURI(), ApiLogFunction.cutRequestBody(requestBody), - apiResponse.getErrorLogUid()); + apiResponse.getErrorLogUid(), + null, + loginAttemptId); auditLogRepository.save(log); } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/AuditLogEntity.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/AuditLogEntity.java index c786d59c..d6c56934 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/AuditLogEntity.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/AuditLogEntity.java @@ -12,6 +12,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; +import java.util.UUID; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -51,6 +52,12 @@ public class AuditLogEntity extends CommonCreateEntity { @Column(name = "error_log_uid") private Long errorLogUid; + @Column(name = "download_uuid") + private UUID downloadUuid; + + @Column(name = "login_attempt_id") + private String loginAttemptId; + public AuditLogEntity( Long userUid, EventType eventType, @@ -59,7 +66,9 @@ public class AuditLogEntity extends CommonCreateEntity { String ipAddress, String requestUri, String requestBody, - Long errorLogUid) { + Long errorLogUid, + UUID downloadUuid, + String loginAttemptId) { this.userUid = userUid; this.eventType = eventType; this.eventStatus = eventStatus; @@ -68,11 +77,18 @@ public class AuditLogEntity extends CommonCreateEntity { this.requestUri = requestUri; this.requestBody = requestBody; this.errorLogUid = errorLogUid; + this.downloadUuid = downloadUuid; + this.loginAttemptId = loginAttemptId; } /** 파일 다운로드 이력 생성 */ public static AuditLogEntity forFileDownload( - Long userId, String requestUri, String menuUid, String ip, int httpStatus) { + Long userId, + String requestUri, + String menuUid, + String ip, + int httpStatus, + UUID downloadUuid) { return new AuditLogEntity( userId, @@ -82,7 +98,9 @@ public class AuditLogEntity extends CommonCreateEntity { ip, requestUri, null, // requestBody 없음 - null // errorLogUid 없음 + null, // errorLogUid 없음 + downloadUuid, + null // loginAttemptId 없음 ); }