Build: enable ktlint+detekt, format sources, add core unit tests
This commit is contained in:
@@ -16,22 +16,30 @@ import reactor.core.publisher.Mono
|
||||
* identity to the downstream services as `X-Account-*` headers.
|
||||
*/
|
||||
@Component
|
||||
class JwtAuthenticationFilter(private val jwtDecoder: JwtDecoder) : GlobalFilter, Ordered {
|
||||
|
||||
override fun filter(exchange: ServerWebExchange, chain: GatewayFilterChain): Mono<Void> {
|
||||
class JwtAuthenticationFilter(
|
||||
private val jwtDecoder: JwtDecoder,
|
||||
) : GlobalFilter,
|
||||
Ordered {
|
||||
override fun filter(
|
||||
exchange: ServerWebExchange,
|
||||
chain: GatewayFilterChain,
|
||||
): Mono<Void> {
|
||||
val path = exchange.request.path.value()
|
||||
if (isPublic(path)) {
|
||||
return chain.filter(exchange)
|
||||
}
|
||||
val token = bearerToken(exchange)
|
||||
?: return unauthorized(exchange, "Требуется вход")
|
||||
val token =
|
||||
bearerToken(exchange)
|
||||
?: return unauthorized(exchange, "Требуется вход")
|
||||
return try {
|
||||
val jwt = jwtDecoder.decode(token)
|
||||
val request = exchange.request.mutate()
|
||||
.header("X-Account-Id", jwt.subject.orEmpty())
|
||||
.header("X-Account-Login", jwt.getClaimAsString("login").orEmpty())
|
||||
.header("X-Account-Role", jwt.getClaimAsString("role").orEmpty())
|
||||
.build()
|
||||
val request =
|
||||
exchange.request
|
||||
.mutate()
|
||||
.header("X-Account-Id", jwt.subject.orEmpty())
|
||||
.header("X-Account-Login", jwt.getClaimAsString("login").orEmpty())
|
||||
.header("X-Account-Role", jwt.getClaimAsString("role").orEmpty())
|
||||
.build()
|
||||
chain.filter(exchange.mutate().request(request).build())
|
||||
} catch (_: JwtException) {
|
||||
unauthorized(exchange, "Недействительный или истёкший токен")
|
||||
@@ -56,7 +64,10 @@ class JwtAuthenticationFilter(private val jwtDecoder: JwtDecoder) : GlobalFilter
|
||||
return header.removePrefix("Bearer ").trim().ifBlank { null }
|
||||
}
|
||||
|
||||
private fun unauthorized(exchange: ServerWebExchange, message: String): Mono<Void> {
|
||||
private fun unauthorized(
|
||||
exchange: ServerWebExchange,
|
||||
message: String,
|
||||
): Mono<Void> {
|
||||
val response = exchange.response
|
||||
response.statusCode = HttpStatus.UNAUTHORIZED
|
||||
response.headers.contentType = MediaType.APPLICATION_JSON
|
||||
|
||||
Reference in New Issue
Block a user