Сервер ресурсов Spring boot OAuth 2 + метод аутентификации резервного копирования фильтра JWT
Я работаю над проектом весенней загрузки с методом аутентификации сервера ресурсов OAuth2, токен доступа проверяется на сервере авторизации.
Это приложение также предоставляет конечную точку для получения токена, подписанного самим собой.
Я хотел бы предоставить метод резервного копирования аутентификации с помощью WebFilter, который проверяет подпись токена, если метод OAuth2 не работает следующим образом:
@Bean
fun securityWebFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
return http.invoke {
csrf { disable() }
authorizeExchange {
authorize("/actuator/**", permitAll)
authorize("/api/login", permitAll)
authorize("/v3/api-docs", permitAll)
authorize("/**", authenticated)
}
oauth2ResourceServer {
jwt {
jwtAuthenticationConverter = oauth2JwtConverter
}
}
addFilterAt(JWTFilter(tokenService), SecurityWebFiltersOrder.AUTHENTICATION)
}
}
Мой JWTFilter:
class JWTFilter(
private val tokenService: TokenService
) : WebFilter {
override fun filter(exchange: ServerWebExchange, chain: WebFilterChain): Mono<Void> {
return resolveToken(exchange.request)
?.takeIf { tokenService.validateToken(it) }
?.let { tokenService.getAuthentication(it) }
?.let { chain.filter(exchange).contextWrite(ReactiveSecurityContextHolder.withAuthentication(it)) }
?: chain.filter(exchange)
}
private fun resolveToken(request: ServerHttpRequest): String? {
return request.headers[AUTHORIZATION_HEADER]
?.get(0)
?.takeIf { it.startsWith("Bearer ") }
?.substring(7)
}
}
Проблема в том, что контекст аутентификации, установленный фильтром, игнорируется, если OAuth2 не работает.
Как я могу это сделать?