diff --git a/src/main/kotlin/roomescape/admin/business/AdminService.kt b/src/main/kotlin/roomescape/admin/business/AdminService.kt index 95657df2..ee938ae1 100644 --- a/src/main/kotlin/roomescape/admin/business/AdminService.kt +++ b/src/main/kotlin/roomescape/admin/business/AdminService.kt @@ -9,11 +9,7 @@ import roomescape.admin.exception.AdminErrorCode import roomescape.admin.exception.AdminException import roomescape.admin.infrastructure.persistence.AdminEntity import roomescape.admin.infrastructure.persistence.AdminRepository -import roomescape.common.dto.AdminLoginCredentials -import roomescape.common.dto.CurrentUserContext -import roomescape.common.dto.OperatorInfo -import roomescape.common.dto.PrincipalType -import roomescape.common.dto.toCredentials +import roomescape.common.dto.* private val log: KLogger = KotlinLogging.logger {} @@ -22,14 +18,15 @@ class AdminService( private val adminRepository: AdminRepository, ) { @Transactional(readOnly = true) - fun findContextById(id: Long): CurrentUserContext { + fun findContextById(id: Long): CurrentAdminContext { log.info { "[AdminService.findById] 현재 로그인된 관리자 조회 시작: id=${id}" } val admin: AdminEntity = findOrThrow(id) - return CurrentUserContext(admin.id, admin.name, PrincipalType.ADMIN).also { - log.info { "[AdminService.findById] 현재 로그인된 관리자 조회 완료: id=${id}" } - } + return admin.toContext() + .also { + log.info { "[AdminService.findById] 현재 로그인된 관리자 조회 완료: id=${id}" } + } } @Transactional(readOnly = true) diff --git a/src/main/kotlin/roomescape/auth/web/support/resolver/AdminContextResolver.kt b/src/main/kotlin/roomescape/auth/web/support/resolver/AdminContextResolver.kt new file mode 100644 index 00000000..81fdbe77 --- /dev/null +++ b/src/main/kotlin/roomescape/auth/web/support/resolver/AdminContextResolver.kt @@ -0,0 +1,49 @@ +package roomescape.auth.web.support.resolver + +import io.github.oshai.kotlinlogging.KLogger +import io.github.oshai.kotlinlogging.KotlinLogging +import jakarta.servlet.http.HttpServletRequest +import org.springframework.core.MethodParameter +import org.springframework.stereotype.Component +import org.springframework.web.bind.support.WebDataBinderFactory +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.web.method.support.HandlerMethodArgumentResolver +import org.springframework.web.method.support.ModelAndViewContainer +import roomescape.admin.business.AdminService +import roomescape.auth.exception.AuthErrorCode +import roomescape.auth.exception.AuthException +import roomescape.auth.infrastructure.jwt.JwtUtils +import roomescape.auth.web.support.Admin +import roomescape.auth.web.support.accessToken + +private val log: KLogger = KotlinLogging.logger {} + +@Component +class AdminContextResolver( + private val jwtUtils: JwtUtils, + private val adminService: AdminService, +) : HandlerMethodArgumentResolver { + + override fun supportsParameter(parameter: MethodParameter): Boolean { + return parameter.hasParameterAnnotation(Admin::class.java) + } + + override fun resolveArgument( + parameter: MethodParameter, + mavContainer: ModelAndViewContainer?, + webRequest: NativeWebRequest, + binderFactory: WebDataBinderFactory? + ): Any? { + val request: HttpServletRequest = webRequest.nativeRequest as HttpServletRequest + val token: String? = request.accessToken() + + try { + val id: Long = jwtUtils.extractSubject(token).toLong() + + return adminService.findContextById(id) + } catch (e: Exception) { + log.info { "[AdminContextResolver] 회원 조회 실패. message=${e.message}" } + throw AuthException(AuthErrorCode.MEMBER_NOT_FOUND) + } + } +} diff --git a/src/main/kotlin/roomescape/auth/web/support/resolver/UserContextResolver.kt b/src/main/kotlin/roomescape/auth/web/support/resolver/UserContextResolver.kt index ffd76fab..7c731c5d 100644 --- a/src/main/kotlin/roomescape/auth/web/support/resolver/UserContextResolver.kt +++ b/src/main/kotlin/roomescape/auth/web/support/resolver/UserContextResolver.kt @@ -9,19 +9,19 @@ import org.springframework.web.bind.support.WebDataBinderFactory import org.springframework.web.context.request.NativeWebRequest import org.springframework.web.method.support.HandlerMethodArgumentResolver import org.springframework.web.method.support.ModelAndViewContainer -import roomescape.auth.business.AuthService import roomescape.auth.exception.AuthErrorCode import roomescape.auth.exception.AuthException import roomescape.auth.infrastructure.jwt.JwtUtils import roomescape.auth.web.support.User import roomescape.auth.web.support.accessToken +import roomescape.user.business.UserService private val log: KLogger = KotlinLogging.logger {} @Component class UserContextResolver( private val jwtUtils: JwtUtils, - private val authService: AuthService + private val userService: UserService, ) : HandlerMethodArgumentResolver { override fun supportsParameter(parameter: MethodParameter): Boolean { @@ -38,11 +38,11 @@ class UserContextResolver( val token: String? = request.accessToken() try { - val (id, type) = jwtUtils.extractIdAndType(token) + val id: Long = jwtUtils.extractSubject(token).toLong() - return authService.findContextById(id, type) + return userService.findContextById(id) } catch (e: Exception) { - log.info { "[MemberIdResolver] 회원 조회 실패. message=${e.message}" } + log.info { "[UserContextResolver] 회원 조회 실패. message=${e.message}" } throw AuthException(AuthErrorCode.MEMBER_NOT_FOUND) } } diff --git a/src/main/kotlin/roomescape/common/config/WebMvcConfig.kt b/src/main/kotlin/roomescape/common/config/WebMvcConfig.kt index 3fe6bec6..b7b182a2 100644 --- a/src/main/kotlin/roomescape/common/config/WebMvcConfig.kt +++ b/src/main/kotlin/roomescape/common/config/WebMvcConfig.kt @@ -6,16 +6,19 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry import org.springframework.web.servlet.config.annotation.WebMvcConfigurer import roomescape.auth.web.support.interceptors.AdminInterceptor import roomescape.auth.web.support.interceptors.UserInterceptor +import roomescape.auth.web.support.resolver.AdminContextResolver import roomescape.auth.web.support.resolver.UserContextResolver @Configuration class WebMvcConfig( private val adminInterceptor: AdminInterceptor, private val userInterceptor: UserInterceptor, - private val userContextResolver: UserContextResolver + private val adminContextResolver: AdminContextResolver, + private val userContextResolver: UserContextResolver, ) : WebMvcConfigurer { override fun addArgumentResolvers(resolvers: MutableList) { + resolvers.add(adminContextResolver) resolvers.add(userContextResolver) } diff --git a/src/main/kotlin/roomescape/common/dto/CommonAuth.kt b/src/main/kotlin/roomescape/common/dto/CommonAuth.kt index e567b417..7262d561 100644 --- a/src/main/kotlin/roomescape/common/dto/CommonAuth.kt +++ b/src/main/kotlin/roomescape/common/dto/CommonAuth.kt @@ -60,12 +60,6 @@ fun UserEntity.toCredentials() = UserLoginCredentials( name = this.name, ) -data class CurrentUserContext( - val id: Long, - val name: String, - val type: PrincipalType -); - enum class PrincipalType { USER, ADMIN } @@ -74,3 +68,24 @@ data class OperatorInfo( val id: Long, val name: String ) + +data class CurrentUserContext( + val id: Long, + val name: String, +) + +data class CurrentAdminContext( + val id: Long, + val name: String, + val type: AdminType, + val storeId: Long?, + val permissionLevel: AdminPermissionLevel +) + +fun AdminEntity.toContext() = CurrentAdminContext( + id = this.id, + name = this.name, + type = this.type, + storeId = this.storeId, + permissionLevel = this.permissionLevel +) diff --git a/src/main/kotlin/roomescape/user/business/UserService.kt b/src/main/kotlin/roomescape/user/business/UserService.kt index ed4b206c..627cbc54 100644 --- a/src/main/kotlin/roomescape/user/business/UserService.kt +++ b/src/main/kotlin/roomescape/user/business/UserService.kt @@ -8,8 +8,8 @@ import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import roomescape.common.config.next import roomescape.common.dto.CurrentUserContext -import roomescape.common.dto.PrincipalType import roomescape.common.dto.UserLoginCredentials +import roomescape.common.dto.toCredentials import roomescape.user.exception.UserErrorCode import roomescape.user.exception.UserException import roomescape.user.infrastructure.persistence.* @@ -34,7 +34,7 @@ class UserService( log.info { "[UserService.findContextById] 현재 로그인된 회원 조회 시작: id=${id}" } val user: UserEntity = findOrThrow(id) - return CurrentUserContext(user.id, user.name, PrincipalType.USER) + return CurrentUserContext(user.id, user.name) .also { log.info { "[UserService.findContextById] 현재 로그인된 회원 조회 완료: id=${id}" } }