From b7b9b278a6e4788e9ee97e3389ddd1b8a6752f36 Mon Sep 17 00:00:00 2001 From: teddy Date: Thu, 22 Jan 2026 17:22:20 +0900 Subject: [PATCH] =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20ip=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/CustomAuthenticationProvider.java | 17 ++++++++++++++++- .../cd/kamcoback/common/utils/UserUtil.java | 7 +++++++ .../postgres/core/GukYuinCoreService.java | 8 ++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinCoreService.java diff --git a/src/main/java/com/kamco/cd/kamcoback/auth/CustomAuthenticationProvider.java b/src/main/java/com/kamco/cd/kamcoback/auth/CustomAuthenticationProvider.java index df3c70cf..c9228a3f 100644 --- a/src/main/java/com/kamco/cd/kamcoback/auth/CustomAuthenticationProvider.java +++ b/src/main/java/com/kamco/cd/kamcoback/auth/CustomAuthenticationProvider.java @@ -3,8 +3,10 @@ package com.kamco.cd.kamcoback.auth; import com.kamco.cd.kamcoback.common.enums.StatusType; import com.kamco.cd.kamcoback.common.enums.error.AuthErrorCode; import com.kamco.cd.kamcoback.common.exception.CustomApiException; +import com.kamco.cd.kamcoback.common.utils.HeaderUtil; import com.kamco.cd.kamcoback.postgres.entity.MemberEntity; import com.kamco.cd.kamcoback.postgres.repository.members.MembersRepository; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.mindrot.jbcrypt.BCrypt; import org.springframework.security.authentication.AuthenticationProvider; @@ -12,11 +14,16 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; @Component @RequiredArgsConstructor public class CustomAuthenticationProvider implements AuthenticationProvider { + ServletRequestAttributes attr = + (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + private final MembersRepository membersRepository; @Override @@ -52,7 +59,15 @@ public class CustomAuthenticationProvider implements AuthenticationProvider { // 인증 성공 → UserDetails 생성 CustomUserDetails userDetails = new CustomUserDetails(member); - return new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + // front에서 전달한 사용자 ip 등록 + HttpServletRequest req = (attr != null) ? attr.getRequest() : null; + String ip = (req != null) ? HeaderUtil.get(req, "kamco-userIp") : null; + + UsernamePasswordAuthenticationToken token = + new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + + token.setDetails(ip); + return token; } @Override diff --git a/src/main/java/com/kamco/cd/kamcoback/common/utils/UserUtil.java b/src/main/java/com/kamco/cd/kamcoback/common/utils/UserUtil.java index ee510208..7e64f0a2 100644 --- a/src/main/java/com/kamco/cd/kamcoback/common/utils/UserUtil.java +++ b/src/main/java/com/kamco/cd/kamcoback/common/utils/UserUtil.java @@ -44,4 +44,11 @@ public class UserUtil { MembersDto.Member user = getCurrentUser(); return user != null ? user.getRole() : null; } + + public String getIp() { + return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()) + .map(auth -> auth.getDetails()) + .map(Object::toString) + .orElse(null); + } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinCoreService.java new file mode 100644 index 00000000..24f91d4f --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinCoreService.java @@ -0,0 +1,8 @@ +package com.kamco.cd.kamcoback.postgres.core; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class GukYuinCoreService {}