[#34] 회원 / 인증 도메인 재정의 #43

Merged
pricelees merged 73 commits from refactor/#34 into main 2025-09-13 10:13:45 +00:00
2 changed files with 54 additions and 0 deletions
Showing only changes of commit c79a4bdd1f - Show all commits

View File

@ -19,3 +19,7 @@ annotation class MemberId
annotation class AdminOnly( annotation class AdminOnly(
val privilege: Privilege val privilege: Privilege
) )
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
annotation class UserOnly

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.CLAIM_TYPE_KEY
import roomescape.auth.exception.AuthErrorCode
import roomescape.auth.exception.AuthException
import roomescape.auth.infrastructure.jwt.JwtUtils
import roomescape.auth.web.support.MDC_MEMBER_ID_KEY
import roomescape.auth.web.support.UserOnly
import roomescape.auth.web.support.accessToken
import roomescape.common.dto.PrincipalType
private val log: KLogger = KotlinLogging.logger {}
@Component
class UserInterceptor(
private val jwtUtils: JwtUtils
) : HandlerInterceptor {
override fun preHandle(
request: HttpServletRequest,
response: HttpServletResponse,
handler: Any
): Boolean {
if ((handler !is HandlerMethod) || (handler.getMethodAnnotation(UserOnly::class.java) == null)) {
return true
}
val token: String? = request.accessToken()
val userId = jwtUtils.extractSubject(token).also { id -> MDC.put(MDC_MEMBER_ID_KEY, id) }
jwtUtils.extractClaim(token, CLAIM_TYPE_KEY).also {
if (it != PrincipalType.USER.name) {
log.warn { "[UserInterceptor] 관리자의 회원 API 접근: id=${userId}" }
throw AuthException(AuthErrorCode.ACCESS_DENIED)
}
}
log.info { "[AuthInterceptor] 인증 완료. userId=$userId" }
return true
}
}