我需要使用请求主体的hmac保护用spring boot、webflux和spring security实现的restapi。简单一点,在一个高级请求中,请求的头包含请求主体的散列值,所以我必须读取头,读取主体,计算主体的散列值,并与头的值进行比较。
我想我应该实施 ServerAuthenticationConverter
但是到目前为止,我所能找到的所有示例都只是查看请求头,而不是正文,我不确定是否可以读取正文,或者是否应该使用缓存正文 Package /修改请求,以便底层组件第二次使用它?
可以使用以下内容:
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);
}
})
...
我收到了ide的警告 copyToString
行:不适当的阻塞方法调用
有什么指南或例子吗?
谢谢!
我也尝试过:
@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()方法中的代码永远不会执行。
1条答案
按热度按时间ftf50wuq1#
我让它工作。张贴我的代码作为参考。
要使其正常工作,需要两个组件:webfilter,它将读取和缓存请求主体,以便多次使用它;serverauthenticationconverter,它将计算主体上的哈希值并验证签名。
}
...
这个
create
方法实现了基于请求方法、路径、头和主体的签名验证逻辑。它返回Authentication
如果成功或Mono.empty()
如果没有。接线方式如下: