From 44b41e78cdc293d68f900a954d387546c9c75736 Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Tue, 24 Oct 2017 20:26:02 -0500 Subject: [PATCH] Flux member variables in favor of Collections Fix gh-4694 --- .../WebFluxSecurityConfiguration.java | 2 +- .../config/web/server/FormLoginTests.java | 2 +- .../web/server/ServerHttpSecurityTests.java | 2 +- ...egatingServerAuthenticationEntryPoint.java | 9 +++++--- .../server/MatcherSecurityWebFilterChain.java | 11 ++++----- .../web/server/WebFilterChainProxy.java | 23 +++++++------------ .../reactive/server/WebTestClientBuilder.java | 2 +- .../web/server/WebFilterChainProxyTests.java | 2 +- 8 files changed, 24 insertions(+), 29 deletions(-) diff --git a/config/src/main/java/org/springframework/security/config/annotation/web/reactive/WebFluxSecurityConfiguration.java b/config/src/main/java/org/springframework/security/config/annotation/web/reactive/WebFluxSecurityConfiguration.java index ca56748934..4469756a8a 100644 --- a/config/src/main/java/org/springframework/security/config/annotation/web/reactive/WebFluxSecurityConfiguration.java +++ b/config/src/main/java/org/springframework/security/config/annotation/web/reactive/WebFluxSecurityConfiguration.java @@ -50,7 +50,7 @@ public class WebFluxSecurityConfiguration { @Bean(SPRING_SECURITY_WEBFILTERCHAINFILTER_BEAN_NAME) @Order(value = WEB_FILTER_CHAIN_FILTER_ORDER) public WebFilterChainProxy springSecurityWebFilterChainFilter() { - return WebFilterChainProxy.fromSecurityWebFilterChainsList(getSecurityWebFilterChains()); + return new WebFilterChainProxy(getSecurityWebFilterChains()); } private List getSecurityWebFilterChains() { diff --git a/config/src/test/java/org/springframework/security/config/web/server/FormLoginTests.java b/config/src/test/java/org/springframework/security/config/web/server/FormLoginTests.java index 1e8e62c941..f69bcd5685 100644 --- a/config/src/test/java/org/springframework/security/config/web/server/FormLoginTests.java +++ b/config/src/test/java/org/springframework/security/config/web/server/FormLoginTests.java @@ -99,7 +99,7 @@ public class FormLoginTests { WebTestClient webTestClient = WebTestClient .bindToController(new CustomLoginPageController(), new WebTestClientBuilder.Http200RestController()) - .webFilter(WebFilterChainProxy.fromSecurityWebFilterChains(securityWebFilter)) + .webFilter(new WebFilterChainProxy(securityWebFilter)) .build(); WebDriver driver = WebTestClientHtmlUnitDriverBuilder diff --git a/config/src/test/java/org/springframework/security/config/web/server/ServerHttpSecurityTests.java b/config/src/test/java/org/springframework/security/config/web/server/ServerHttpSecurityTests.java index 0856e080ac..8366473560 100644 --- a/config/src/test/java/org/springframework/security/config/web/server/ServerHttpSecurityTests.java +++ b/config/src/test/java/org/springframework/security/config/web/server/ServerHttpSecurityTests.java @@ -118,7 +118,7 @@ public class ServerHttpSecurityTests { } private WebTestClient buildClient() { - WebFilterChainProxy springSecurityFilterChain = WebFilterChainProxy.fromSecurityWebFilterChains( + WebFilterChainProxy springSecurityFilterChain = new WebFilterChainProxy( this.http.build()); return WebTestClientBuilder.bindToWebFilters(springSecurityFilterChain).build(); } diff --git a/web/src/main/java/org/springframework/security/web/server/DelegatingServerAuthenticationEntryPoint.java b/web/src/main/java/org/springframework/security/web/server/DelegatingServerAuthenticationEntryPoint.java index da283d7a5d..91628bd7e1 100644 --- a/web/src/main/java/org/springframework/security/web/server/DelegatingServerAuthenticationEntryPoint.java +++ b/web/src/main/java/org/springframework/security/web/server/DelegatingServerAuthenticationEntryPoint.java @@ -17,6 +17,7 @@ package org.springframework.security.web.server; import org.springframework.http.HttpStatus; +import org.springframework.util.Assert; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -33,7 +34,7 @@ import java.util.List; */ public class DelegatingServerAuthenticationEntryPoint implements ServerAuthenticationEntryPoint { - private final Flux entryPoints; + private final List entryPoints; private ServerAuthenticationEntryPoint defaultEntryPoint = (exchange, e) -> { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); @@ -47,12 +48,14 @@ public class DelegatingServerAuthenticationEntryPoint public DelegatingServerAuthenticationEntryPoint( List entryPoints) { - this.entryPoints = Flux.fromIterable(entryPoints); + Assert.notEmpty(entryPoints, "entryPoints cannot be null"); + this.entryPoints = entryPoints; } public Mono commence(ServerWebExchange exchange, AuthenticationException e) { - return this.entryPoints.filterWhen( entry -> isMatch(exchange, entry)) + return Flux.fromIterable(this.entryPoints) + .filterWhen( entry -> isMatch(exchange, entry)) .next() .map( entry -> entry.getEntryPoint()) .defaultIfEmpty(this.defaultEntryPoint) diff --git a/web/src/main/java/org/springframework/security/web/server/MatcherSecurityWebFilterChain.java b/web/src/main/java/org/springframework/security/web/server/MatcherSecurityWebFilterChain.java index 685e31aca3..99972e4bde 100644 --- a/web/src/main/java/org/springframework/security/web/server/MatcherSecurityWebFilterChain.java +++ b/web/src/main/java/org/springframework/security/web/server/MatcherSecurityWebFilterChain.java @@ -17,6 +17,7 @@ package org.springframework.security.web.server; import org.springframework.security.web.server.util.matcher.ServerWebExchangeMatcher; +import org.springframework.util.Assert; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import reactor.core.publisher.Flux; @@ -30,13 +31,11 @@ import java.util.List; */ public class MatcherSecurityWebFilterChain implements SecurityWebFilterChain { private final ServerWebExchangeMatcher matcher; - private final Flux filters; + private final List filters; public MatcherSecurityWebFilterChain(ServerWebExchangeMatcher matcher, List filters) { - this(matcher, Flux.fromIterable(filters)); - } - - public MatcherSecurityWebFilterChain(ServerWebExchangeMatcher matcher, Flux filters) { + Assert.notNull(matcher, "matcher cannot be null"); + Assert.notEmpty(filters, "filters cannot be null or empty. Got " + filters); this.matcher = matcher; this.filters = filters; } @@ -49,6 +48,6 @@ public class MatcherSecurityWebFilterChain implements SecurityWebFilterChain { @Override public Flux getWebFilters() { - return filters; + return Flux.fromIterable(this.filters); } } diff --git a/web/src/main/java/org/springframework/security/web/server/WebFilterChainProxy.java b/web/src/main/java/org/springframework/security/web/server/WebFilterChainProxy.java index 94df035179..e3fb2e66d1 100644 --- a/web/src/main/java/org/springframework/security/web/server/WebFilterChainProxy.java +++ b/web/src/main/java/org/springframework/security/web/server/WebFilterChainProxy.java @@ -15,6 +15,7 @@ */ package org.springframework.security.web.server; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -33,15 +34,19 @@ import reactor.core.publisher.Mono; * @since 5.0 */ public class WebFilterChainProxy implements WebFilter { - private final Flux filters; + private final List filters; - public WebFilterChainProxy(Flux filters) { + public WebFilterChainProxy(List filters) { this.filters = filters; } + public WebFilterChainProxy(SecurityWebFilterChain... filters) { + this.filters = Arrays.asList(filters); + } + @Override public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { - return filters + return Flux.fromIterable(this.filters) .filterWhen( securityWebFilterChain -> securityWebFilterChain.matches(exchange)) .next() .switchIfEmpty(chain.filter(exchange).then(Mono.empty())) @@ -52,16 +57,4 @@ public class WebFilterChainProxy implements WebFilter { .map( handler -> new DefaultWebFilterChain(handler) ) .flatMap( securedChain -> securedChain.filter(exchange)); } - - public static WebFilterChainProxy fromWebFiltersList(List filters) { - return new WebFilterChainProxy(Flux.just(new MatcherSecurityWebFilterChain(ServerWebExchangeMatchers.anyExchange(), filters))); - } - - public static WebFilterChainProxy fromSecurityWebFilterChainsList(List securityWebFilterChains) { - return new WebFilterChainProxy(Flux.fromIterable(securityWebFilterChains)); - } - - public static WebFilterChainProxy fromSecurityWebFilterChains(SecurityWebFilterChain... securityWebFilterChains) { - return fromSecurityWebFilterChainsList(Arrays.asList(securityWebFilterChains)); - } } diff --git a/web/src/test/java/org/springframework/security/test/web/reactive/server/WebTestClientBuilder.java b/web/src/test/java/org/springframework/security/test/web/reactive/server/WebTestClientBuilder.java index 4e9298b772..2ed8654b8b 100644 --- a/web/src/test/java/org/springframework/security/test/web/reactive/server/WebTestClientBuilder.java +++ b/web/src/test/java/org/springframework/security/test/web/reactive/server/WebTestClientBuilder.java @@ -40,7 +40,7 @@ public class WebTestClientBuilder { } public static Builder bindToWebFilters(SecurityWebFilterChain securityWebFilterChain) { - return bindToWebFilters(WebFilterChainProxy.fromSecurityWebFilterChains(securityWebFilterChain)); + return bindToWebFilters(new WebFilterChainProxy(securityWebFilterChain)); } @RestController diff --git a/web/src/test/java/org/springframework/security/web/server/WebFilterChainProxyTests.java b/web/src/test/java/org/springframework/security/web/server/WebFilterChainProxyTests.java index 4236d2445d..f62b0c4efc 100644 --- a/web/src/test/java/org/springframework/security/web/server/WebFilterChainProxyTests.java +++ b/web/src/test/java/org/springframework/security/web/server/WebFilterChainProxyTests.java @@ -42,7 +42,7 @@ public class WebFilterChainProxyTests { List filters = Arrays.asList(new Http200WebFilter()); ServerWebExchangeMatcher notMatch = exchange -> MatchResult.notMatch(); MatcherSecurityWebFilterChain chain = new MatcherSecurityWebFilterChain(notMatch, filters); - WebFilterChainProxy filter = WebFilterChainProxy.fromSecurityWebFilterChains(chain); + WebFilterChainProxy filter = new WebFilterChainProxy(chain); WebTestClient.bindToController(new Object()).webFilter(filter).build() .get()