Да, это вызов блокировки.
Во-первых, Spring WebFlux основан на Reactor. В Reactor большинство методов обработки не будут получать null
от Mono
emit, например map
, flatMap
. Конечно, есть контрпримеры, такие как doOnSuccess
, см. Также javado c из Mono
.
Итак, мы можем просто использовать методы обработки для фильтрации результатов вместо block
. Эти методы обработки возвращают пустой Mono
при получении значения null
.
Вторичный, когда авторизация не удалась, мы должны вернуть пустой Mono вместо вызова chain.filter
. chain.filter
означает «Все нормально! Просто сделайте что-нибудь после фильтра!». См. Также RequestRateLimiterGatewayFilterFactory
, он также изменяет response
.
Итак, мы должны установить response
как завершенное и вернуть пустой Mono
, если авторизация не удалась.
Попробуйте это :
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> exchange
.getPrincipal()
.filter(principal -> principal instanceof UserAuthenticationToken) // Custom implementation of UsernamePasswordAuthenticationToken
.cast(UserAuthenticationToken.class)
.flatMap(userAuthenticationToken -> extractAuthoritiesAndSetThatToRequest(exchange, userAuthenticationToken))
.switchIfEmpty(Mono.defer(() -> exchange.getResponse().setComplete().then(Mono.empty())))
.flatMap(chain::filter);
}
// Maybe return empty Mono, e.g. findOneByUri not found, or Permissions does not containing
private Mono<ServerWebExchange> extractAuthoritiesAndSetThatToRequest(ServerWebExchange exchange, UserAuthenticationToken authentication) {
return uriActionMappingRepository.findOneByUri(exchange.getRequest().getPath().toString())
.filter(it -> authentication.getPermission().containsKey(it.getName()))
.map(it -> exchange.mutate()
.request(builder -> builder.header("X-Auth", authentication.getName()))
.build());
}
О mutate request
, см. Также RewritePathGatewayFilterFactory
.