private <T extends WebFilter> Optional<T> getWebFilter(SecurityWebFilterChain filterChain, Class<T> filterClass) { return (Optional<T>) filterChain.getWebFilters() .filter(Objects::nonNull) .filter(filter -> filter.getClass().isAssignableFrom(filterClass)) .singleOrEmpty() .blockOptional(); }
@Test @SuppressWarnings("unchecked") public void addFilterAfterIsApplied(){ SecurityWebFilterChain securityWebFilterChain = this.http.addFilterAfter(new TestWebFilter(), SecurityWebFiltersOrder.SECURITY_CONTEXT_SERVER_WEB_EXCHANGE).build(); List filters = securityWebFilterChain.getWebFilters().map(WebFilter::getClass).collectList().block(); assertThat(filters).isNotNull() .isNotEmpty() .containsSequence(SecurityContextServerWebExchangeWebFilter.class, TestWebFilter.class); }
@Test @SuppressWarnings("unchecked") public void addFilterBeforeIsApplied(){ SecurityWebFilterChain securityWebFilterChain = this.http.addFilterBefore(new TestWebFilter(), SecurityWebFiltersOrder.SECURITY_CONTEXT_SERVER_WEB_EXCHANGE).build(); List filters = securityWebFilterChain.getWebFilters().map(WebFilter::getClass).collectList().block(); assertThat(filters).isNotNull() .isNotEmpty() .containsSequence(TestWebFilter.class, SecurityContextServerWebExchangeWebFilter.class); }
@Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { return filters .filterWhen( securityWebFilterChain -> securityWebFilterChain.matches(exchange)) .next() .flatMap( securityWebFilterChain -> securityWebFilterChain.getWebFilters() .collectList() ) .map( filters -> new FilteringWebHandler(webHandler -> chain.filter(webHandler), filters)) .map( handler -> new DefaultWebFilterChain(handler) ) .flatMap( securedChain -> securedChain.filter(exchange)); }
@Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { return Flux.fromIterable(this.filters) .filterWhen( securityWebFilterChain -> securityWebFilterChain.matches(exchange)) .next() .switchIfEmpty(chain.filter(exchange).then(Mono.empty())) .flatMap( securityWebFilterChain -> securityWebFilterChain.getWebFilters() .collectList() ) .map( filters -> new FilteringWebHandler(webHandler -> chain.filter(webHandler), filters)) .map( handler -> new DefaultWebFilterChain(handler) ) .flatMap( securedChain -> securedChain.filter(exchange)); } }