作为 Kotlin 和 Micronaut 的新手,我想编写一个简单的 HttpServerFilter 来检查传入的 http 请求标头。
如果它包含特定的 X-API-Key 值,则继续,否则返回未授权。
类似的东西:
class APIKeyFilter: HttpServerFilter {
override fun doFilter(request: HttpRequest<*>?, chain: ServerFilterChain?): Publisher<MutableHttpResponse<*>> {
val apiKey = request.headers.get("X-API-Key")
if (apiKey == null || !Base64.getDecoder().decode(apiKey).contentEquals("your-api-key".toByteArray())) {
return HttpResponse.unauthorized()
}
return chain.proceed(request)
}
}
鉴于返回是发布者,这怎么可能实现?
我尝试按照文档进行操作,但是对于看起来非常简单的事情来说它非常复杂。 https://docs.micronaut.io/latest/guide/#filters
这似乎有效:
class APIKeyFilter: HttpServerFilter {
override fun doFilter(request: HttpRequest<*>?, chain: ServerFilterChain?): Publisher<MutableHttpResponse<*>> {
return if (hasApiKey(request)) {
chain!!.proceed(request)
} else {
Mono.just(HttpResponse.unauthorized<Any>())
}
}
}
也许 Mono.just 可以用更合适的东西代替,但我必须研究其他选择。
我有这个代码而不是这个作品
return HttpResponse.status<Any>(HttpStatus.FORBIDDEN)
.header(
HttpHeaders.CONTENT_TYPE,
MediaType.APPLICATION_JSON
).body(
ErrorResponse
)
.toPublisher()