如何使用 Kotlin 在 Micronaut HttpServerFilter 中返回未经授权

问题描述 投票:0回答:2

作为 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

security micronaut
2个回答
0
投票

这似乎有效:

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 可以用更合适的东西代替,但我必须研究其他选择。


0
投票

我有这个代码而不是这个作品

    return HttpResponse.status<Any>(HttpStatus.FORBIDDEN)
        .header(
            HttpHeaders.CONTENT_TYPE,
            MediaType.APPLICATION_JSON
        ).body(
            ErrorResponse
        )
        .toPublisher()
© www.soinside.com 2019 - 2024. All rights reserved.