在我的 WebFilter Webflux 的 StepVerifier 中断言 ReactiveSecurityContextHolder.getContext()

Assert ReactiveSecurityContextHolder.getContext() in the StepVerifier of my WebFilter Webflux

我正在迁移基于 Servlet 的安全库。

我需要使用 ReactiveSecurityContextHolder.getContext() 而不是 SecurityContextHolder.getContext()。

我有一个修改身份验证的 WebFLux WebFilter。

  @Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {        
...
   return chain.filter(exchange).subscriberContext(ReactiveSecurityContextHolder.withAuthentication(authentication));

}

我想在 ReactiveSecurityContextHolder.getContext() 中声明身份验证。 StepVerifier.create(filter.filter(MockServerWebExchange.from(请求), filterChain)).expectNext(...).verifyComplete();

无论我尝试什么,上下文都是空的,因为我必须订阅 ReactiveSecurityContextHolder.getContext() 返回的 Mono。

我尝试了 ReactiveSecurityContextHolder.getContext().block() 但没有成功。

可能是我测试的方式不对

一种方法是使用基本上是 lambda 的 WebFilterChain。

所以我们可以有一个 WebFilterChain : (exchange) -> Mono.empty()

但是我们需要一个使用 ReactiveSecurityContextHolder.getContext() 而不是 Mono.empty();

的 lambda

结果如下:

    var request = MockServerHttpRequest
            .get("/api/test")
            .header(HttpHeaders.AUTHORIZATION, "Bearer " + jwt);

    var exchange = MockServerWebExchange.from(request);

    StepVerifier.create(filter.filter(
            exchange,
            it -> ReactiveSecurityContextHolder.getContext()
                    .map(SecurityContext::getAuthentication)
                    .map(JWTAuthentication.class::cast)
                    .doOnSuccess(auth -> assertThat(auth.getUserId()).isEqualTo("username"))
                    .doOnSuccess(auth -> assertThat(auth.getJwt()).isEqualTo(jwt))
                    .doOnSuccess(auth -> assertThat(auth.getSubscriptions()).isEmpty())
                    .then()
    )).verifyComplete();