feat: 관리자 / 회원 구분없는 '로그인 상태' 확인 API와 로그인 여부와 상관없이 사용 가능한 API에 사용할 새로운 Interceptor 및 어노테이션 추가

This commit is contained in:
이상진 2025-09-11 17:01:04 +09:00
parent c79a4bdd1f
commit 7f1ab906b7
2 changed files with 58 additions and 0 deletions

View File

@ -23,3 +23,11 @@ annotation class AdminOnly(
@Target(AnnotationTarget.FUNCTION) @Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME) @Retention(AnnotationRetention.RUNTIME)
annotation class UserOnly annotation class UserOnly
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
annotation class Authenticated
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
annotation class Public

View File

@ -0,0 +1,50 @@
package roomescape.auth.web.support.interceptors
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse
import org.slf4j.MDC
import org.springframework.stereotype.Component
import org.springframework.web.method.HandlerMethod
import org.springframework.web.servlet.HandlerInterceptor
import roomescape.auth.business.AuthServiceV2
import roomescape.auth.business.CLAIM_TYPE_KEY
import roomescape.auth.infrastructure.jwt.JwtUtils
import roomescape.auth.web.support.Authenticated
import roomescape.auth.web.support.MDC_MEMBER_ID_KEY
import roomescape.auth.web.support.accessToken
import roomescape.common.dto.PrincipalType
private val log: KLogger = KotlinLogging.logger {}
@Component
class AuthenticatedInterceptor(
private val jwtUtils: JwtUtils,
private val authService: AuthServiceV2
) : HandlerInterceptor {
override fun preHandle(
request: HttpServletRequest,
response: HttpServletResponse,
handler: Any
): Boolean {
if ((handler !is HandlerMethod) || (handler.getMethodAnnotation(Authenticated::class.java) == null)) {
return true
}
val token: String? = request.accessToken()
val id = jwtUtils.extractSubject(token).also { MDC.put(MDC_MEMBER_ID_KEY, it) }
val type = jwtUtils.extractClaim(token, CLAIM_TYPE_KEY)
try {
authService.findContextById(id.toLong(), PrincipalType.valueOf(type))
log.info { "[AuthenticatedInterceptor] 인증 완료. id=$id, type=${type}" }
return true
} catch (e: Exception) {
throw e
}
}
}