在我的 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();
我正在迁移基于 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();