generated from pricelees/issue-pr-template
refactor: 회원 / 관리자 Resolver 분리
This commit is contained in:
parent
c6dd8a977c
commit
5aa6a6cc2c
@ -9,11 +9,7 @@ import roomescape.admin.exception.AdminErrorCode
|
|||||||
import roomescape.admin.exception.AdminException
|
import roomescape.admin.exception.AdminException
|
||||||
import roomescape.admin.infrastructure.persistence.AdminEntity
|
import roomescape.admin.infrastructure.persistence.AdminEntity
|
||||||
import roomescape.admin.infrastructure.persistence.AdminRepository
|
import roomescape.admin.infrastructure.persistence.AdminRepository
|
||||||
import roomescape.common.dto.AdminLoginCredentials
|
import roomescape.common.dto.*
|
||||||
import roomescape.common.dto.CurrentUserContext
|
|
||||||
import roomescape.common.dto.OperatorInfo
|
|
||||||
import roomescape.common.dto.PrincipalType
|
|
||||||
import roomescape.common.dto.toCredentials
|
|
||||||
|
|
||||||
private val log: KLogger = KotlinLogging.logger {}
|
private val log: KLogger = KotlinLogging.logger {}
|
||||||
|
|
||||||
@ -22,14 +18,15 @@ class AdminService(
|
|||||||
private val adminRepository: AdminRepository,
|
private val adminRepository: AdminRepository,
|
||||||
) {
|
) {
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
fun findContextById(id: Long): CurrentUserContext {
|
fun findContextById(id: Long): CurrentAdminContext {
|
||||||
log.info { "[AdminService.findById] 현재 로그인된 관리자 조회 시작: id=${id}" }
|
log.info { "[AdminService.findById] 현재 로그인된 관리자 조회 시작: id=${id}" }
|
||||||
|
|
||||||
val admin: AdminEntity = findOrThrow(id)
|
val admin: AdminEntity = findOrThrow(id)
|
||||||
|
|
||||||
return CurrentUserContext(admin.id, admin.name, PrincipalType.ADMIN).also {
|
return admin.toContext()
|
||||||
log.info { "[AdminService.findById] 현재 로그인된 관리자 조회 완료: id=${id}" }
|
.also {
|
||||||
}
|
log.info { "[AdminService.findById] 현재 로그인된 관리자 조회 완료: id=${id}" }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
|
|||||||
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -9,19 +9,19 @@ import org.springframework.web.bind.support.WebDataBinderFactory
|
|||||||
import org.springframework.web.context.request.NativeWebRequest
|
import org.springframework.web.context.request.NativeWebRequest
|
||||||
import org.springframework.web.method.support.HandlerMethodArgumentResolver
|
import org.springframework.web.method.support.HandlerMethodArgumentResolver
|
||||||
import org.springframework.web.method.support.ModelAndViewContainer
|
import org.springframework.web.method.support.ModelAndViewContainer
|
||||||
import roomescape.auth.business.AuthService
|
|
||||||
import roomescape.auth.exception.AuthErrorCode
|
import roomescape.auth.exception.AuthErrorCode
|
||||||
import roomescape.auth.exception.AuthException
|
import roomescape.auth.exception.AuthException
|
||||||
import roomescape.auth.infrastructure.jwt.JwtUtils
|
import roomescape.auth.infrastructure.jwt.JwtUtils
|
||||||
import roomescape.auth.web.support.User
|
import roomescape.auth.web.support.User
|
||||||
import roomescape.auth.web.support.accessToken
|
import roomescape.auth.web.support.accessToken
|
||||||
|
import roomescape.user.business.UserService
|
||||||
|
|
||||||
private val log: KLogger = KotlinLogging.logger {}
|
private val log: KLogger = KotlinLogging.logger {}
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
class UserContextResolver(
|
class UserContextResolver(
|
||||||
private val jwtUtils: JwtUtils,
|
private val jwtUtils: JwtUtils,
|
||||||
private val authService: AuthService
|
private val userService: UserService,
|
||||||
) : HandlerMethodArgumentResolver {
|
) : HandlerMethodArgumentResolver {
|
||||||
|
|
||||||
override fun supportsParameter(parameter: MethodParameter): Boolean {
|
override fun supportsParameter(parameter: MethodParameter): Boolean {
|
||||||
@ -38,11 +38,11 @@ class UserContextResolver(
|
|||||||
val token: String? = request.accessToken()
|
val token: String? = request.accessToken()
|
||||||
|
|
||||||
try {
|
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) {
|
} catch (e: Exception) {
|
||||||
log.info { "[MemberIdResolver] 회원 조회 실패. message=${e.message}" }
|
log.info { "[UserContextResolver] 회원 조회 실패. message=${e.message}" }
|
||||||
throw AuthException(AuthErrorCode.MEMBER_NOT_FOUND)
|
throw AuthException(AuthErrorCode.MEMBER_NOT_FOUND)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,16 +6,19 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry
|
|||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer
|
||||||
import roomescape.auth.web.support.interceptors.AdminInterceptor
|
import roomescape.auth.web.support.interceptors.AdminInterceptor
|
||||||
import roomescape.auth.web.support.interceptors.UserInterceptor
|
import roomescape.auth.web.support.interceptors.UserInterceptor
|
||||||
|
import roomescape.auth.web.support.resolver.AdminContextResolver
|
||||||
import roomescape.auth.web.support.resolver.UserContextResolver
|
import roomescape.auth.web.support.resolver.UserContextResolver
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
class WebMvcConfig(
|
class WebMvcConfig(
|
||||||
private val adminInterceptor: AdminInterceptor,
|
private val adminInterceptor: AdminInterceptor,
|
||||||
private val userInterceptor: UserInterceptor,
|
private val userInterceptor: UserInterceptor,
|
||||||
private val userContextResolver: UserContextResolver
|
private val adminContextResolver: AdminContextResolver,
|
||||||
|
private val userContextResolver: UserContextResolver,
|
||||||
) : WebMvcConfigurer {
|
) : WebMvcConfigurer {
|
||||||
|
|
||||||
override fun addArgumentResolvers(resolvers: MutableList<HandlerMethodArgumentResolver>) {
|
override fun addArgumentResolvers(resolvers: MutableList<HandlerMethodArgumentResolver>) {
|
||||||
|
resolvers.add(adminContextResolver)
|
||||||
resolvers.add(userContextResolver)
|
resolvers.add(userContextResolver)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -60,12 +60,6 @@ fun UserEntity.toCredentials() = UserLoginCredentials(
|
|||||||
name = this.name,
|
name = this.name,
|
||||||
)
|
)
|
||||||
|
|
||||||
data class CurrentUserContext(
|
|
||||||
val id: Long,
|
|
||||||
val name: String,
|
|
||||||
val type: PrincipalType
|
|
||||||
);
|
|
||||||
|
|
||||||
enum class PrincipalType {
|
enum class PrincipalType {
|
||||||
USER, ADMIN
|
USER, ADMIN
|
||||||
}
|
}
|
||||||
@ -74,3 +68,24 @@ data class OperatorInfo(
|
|||||||
val id: Long,
|
val id: Long,
|
||||||
val name: String
|
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
|
||||||
|
)
|
||||||
|
|||||||
@ -8,8 +8,8 @@ import org.springframework.stereotype.Service
|
|||||||
import org.springframework.transaction.annotation.Transactional
|
import org.springframework.transaction.annotation.Transactional
|
||||||
import roomescape.common.config.next
|
import roomescape.common.config.next
|
||||||
import roomescape.common.dto.CurrentUserContext
|
import roomescape.common.dto.CurrentUserContext
|
||||||
import roomescape.common.dto.PrincipalType
|
|
||||||
import roomescape.common.dto.UserLoginCredentials
|
import roomescape.common.dto.UserLoginCredentials
|
||||||
|
import roomescape.common.dto.toCredentials
|
||||||
import roomescape.user.exception.UserErrorCode
|
import roomescape.user.exception.UserErrorCode
|
||||||
import roomescape.user.exception.UserException
|
import roomescape.user.exception.UserException
|
||||||
import roomescape.user.infrastructure.persistence.*
|
import roomescape.user.infrastructure.persistence.*
|
||||||
@ -34,7 +34,7 @@ class UserService(
|
|||||||
log.info { "[UserService.findContextById] 현재 로그인된 회원 조회 시작: id=${id}" }
|
log.info { "[UserService.findContextById] 현재 로그인된 회원 조회 시작: id=${id}" }
|
||||||
val user: UserEntity = findOrThrow(id)
|
val user: UserEntity = findOrThrow(id)
|
||||||
|
|
||||||
return CurrentUserContext(user.id, user.name, PrincipalType.USER)
|
return CurrentUserContext(user.id, user.name)
|
||||||
.also {
|
.also {
|
||||||
log.info { "[UserService.findContextById] 현재 로그인된 회원 조회 완료: id=${id}" }
|
log.info { "[UserService.findContextById] 현재 로그인된 회원 조회 완료: id=${id}" }
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user