【发布时间】:2021-06-23 14:25:42
【问题描述】:
我需要使用请求正文的 HMAC 来保护通过 Spring Boot、WebFlux 和 spring security 实现的 REST API。稍微简化一下,在高层次上 - 请求带有具有请求正文散列值的标头,因此我必须读取标头,读取正文,计算正文的哈希并与标头值进行比较。
我认为我应该实现ServerAuthenticationConverter,但到目前为止我能找到的所有示例都只查看请求标头,而不是正文,我不确定我是否可以只阅读正文,或者我应该包装/用缓存的主体改变请求,以便它可以被底层组件第二次使用?
是否可以使用以下内容:
public class HttpHmacAuthenticationConverter implements ServerAuthenticationConverter {
@Override
public Mono<Authentication> convert(ServerWebExchange exchange) {
exchange.getRequest().getBody()
.next()
.flatMap(dataBuffer -> {
try {
return Mono.just(StreamUtils.copyToString(dataBuffer.asInputStream(), StandardCharsets.UTF_8));
} catch (IOException e) {
return Mono.error(e);
}
})
...
我在 copyToString 行收到来自 IDE 的警告:不适当的阻塞方法调用
任何指南或示例?
谢谢!
我也试过了:
@Override
public Mono<Authentication> convert(ServerWebExchange exchange) {
return Mono.justOrEmpty(exchange.getRequest().getHeaders().toSingleValueMap())
.zipWith(exchange.getRequest().getBody().next()
.flatMap(dataBuffer -> Mono.just(dataBuffer.asByteBuffer().array()))
)
.flatMap(tuple -> create(tuple.getT1(), tuple.getT2()));
但这不起作用 - 最后一行的 create() 方法中的代码永远不会执行。
【问题讨论】:
标签: spring spring-security spring-webflux