-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
* nullable한 userResolver 추가 * UserOrNullResolver 추가 완료 * Post Service 수정
- Loading branch information
Showing
11 changed files
with
157 additions
and
19 deletions.
There are no files selected for viewing
3 changes: 3 additions & 0 deletions
3
src/main/kotlin/com/waffletoy/team1server/config/WebConfig.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,18 @@ | ||
package com.waffletoy.team1server.config | ||
|
||
import com.waffletoy.team1server.user.UserArgumentResolver | ||
import com.waffletoy.team1server.user.UserOrNullArgumentResolver | ||
import org.springframework.context.annotation.Configuration | ||
import org.springframework.web.method.support.HandlerMethodArgumentResolver | ||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer | ||
|
||
@Configuration | ||
class WebConfig( | ||
private val userArgumentResolver: UserArgumentResolver, | ||
private val userOrNullArgumentResolver: UserOrNullArgumentResolver, | ||
) : WebMvcConfigurer { | ||
override fun addArgumentResolvers(resolvers: MutableList<HandlerMethodArgumentResolver>) { | ||
resolvers.add(userArgumentResolver) | ||
resolvers.add(userOrNullArgumentResolver) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
5 changes: 5 additions & 0 deletions
5
src/main/kotlin/com/waffletoy/team1server/user/AuthUserOrNull.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
package com.waffletoy.team1server.user | ||
|
||
@Target(AnnotationTarget.VALUE_PARAMETER) | ||
@Retention(AnnotationRetention.RUNTIME) | ||
annotation class AuthUserOrNull |
78 changes: 78 additions & 0 deletions
78
src/main/kotlin/com/waffletoy/team1server/user/UserOrNullArgumentResolver.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
package com.waffletoy.team1server.user | ||
|
||
import com.waffletoy.team1server.exceptions.ApiException | ||
import com.waffletoy.team1server.exceptions.BadAuthorizationHeaderException | ||
import com.waffletoy.team1server.exceptions.InvalidAccessTokenException | ||
import com.waffletoy.team1server.user.dtos.User | ||
import com.waffletoy.team1server.user.service.UserService | ||
import org.slf4j.Logger | ||
import org.slf4j.LoggerFactory | ||
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 | ||
|
||
@Component | ||
class UserOrNullArgumentResolver( | ||
private val userService: UserService, | ||
) : HandlerMethodArgumentResolver { | ||
private val logger: Logger = LoggerFactory.getLogger(UserOrNullArgumentResolver::class.java) | ||
|
||
override fun supportsParameter(parameter: MethodParameter): Boolean { | ||
val isSupported = | ||
parameter.parameterType == User::class.java && | ||
parameter.hasParameterAnnotation(AuthUserOrNull::class.java) | ||
logger.debug("supportsParameter called for parameter '${parameter.parameterName}': $isSupported") | ||
return isSupported | ||
} | ||
|
||
// Authorization header 가 없으면 exception 대신 null 을 반환 | ||
override fun resolveArgument( | ||
parameter: MethodParameter, | ||
mavContainer: ModelAndViewContainer?, | ||
webRequest: NativeWebRequest, | ||
binderFactory: WebDataBinderFactory?, | ||
): User? { | ||
logger.debug("resolveArgument called for parameter: ${parameter.parameterName}") | ||
|
||
val authorizationHeader = webRequest.getHeader("Authorization") | ||
logger.debug("Authorization Header: $authorizationHeader") | ||
|
||
// Check if the Authorization header is present and not blank | ||
if (authorizationHeader.isNullOrBlank()) { | ||
logger.warn("Authorization header is missing or blank") | ||
return null | ||
} | ||
|
||
// Split the header and validate the format (e.g., "Bearer <token>") | ||
val tokenParts = authorizationHeader.split(" ") | ||
if (tokenParts.size != 2 || tokenParts[0] != "Bearer") { | ||
logger.warn("Authorization header is malformed: $authorizationHeader") | ||
throw BadAuthorizationHeaderException( | ||
details = mapOf("Authorization" to "Malformed Authorization header. Expected format: Bearer <token>"), | ||
) | ||
} | ||
|
||
val accessToken = tokenParts[1] | ||
logger.debug("Extracted Access Token: $accessToken") | ||
|
||
return try { | ||
// Authenticate the user using the extracted access token | ||
userService.authenticate(accessToken).also { | ||
logger.debug("Authenticated User: $it") | ||
} | ||
} catch (ex: ApiException) { | ||
// Propagate ApiException without modification | ||
logger.error("Authentication failed: ${ex.message}", ex) | ||
throw ex | ||
} catch (ex: Exception) { | ||
// Handle unexpected exceptions by wrapping them in an ApiException | ||
logger.error("Unexpected error during authentication: ${ex.message}", ex) | ||
throw InvalidAccessTokenException( | ||
details = mapOf("error" to ex.message.orEmpty()), | ||
) | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters