|
@@ -67,6 +67,9 @@ import org.springframework.web.server.WebFilter;
|
|
|
import org.springframework.web.server.WebFilterChain;
|
|
|
import reactor.core.publisher.Mono;
|
|
|
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.PrintWriter;
|
|
|
+import java.io.StringWriter;
|
|
|
import java.time.Duration;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Arrays;
|
|
@@ -102,6 +105,8 @@ public class ServerHttpSecurity {
|
|
|
|
|
|
private List<WebFilter> webFilters = new ArrayList<>();
|
|
|
|
|
|
+ private Throwable built;
|
|
|
+
|
|
|
/**
|
|
|
* The ServerExchangeMatcher that determines which requests apply to this HttpSecurity instance.
|
|
|
*
|
|
@@ -174,6 +179,10 @@ public class ServerHttpSecurity {
|
|
|
}
|
|
|
|
|
|
public SecurityWebFilterChain build() {
|
|
|
+ if(this.built != null) {
|
|
|
+ throw new IllegalStateException("This has already been built with the following stacktrace. " + buildToString());
|
|
|
+ }
|
|
|
+ this.built = new RuntimeException("First Build Invocation").fillInStackTrace();
|
|
|
if(this.headers != null) {
|
|
|
this.headers.configure(this);
|
|
|
}
|
|
@@ -216,6 +225,21 @@ public class ServerHttpSecurity {
|
|
|
return new MatcherSecurityWebFilterChain(getSecurityMatcher(), this.webFilters);
|
|
|
}
|
|
|
|
|
|
+ private String buildToString() {
|
|
|
+ try(StringWriter writer = new StringWriter()) {
|
|
|
+ try(PrintWriter printer = new PrintWriter(writer)) {
|
|
|
+ printer.println();
|
|
|
+ printer.println();
|
|
|
+ this.built.printStackTrace(printer);
|
|
|
+ printer.println();
|
|
|
+ printer.println();
|
|
|
+ return writer.toString();
|
|
|
+ }
|
|
|
+ } catch(IOException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private ServerAuthenticationEntryPoint getServerAuthenticationEntryPoint() {
|
|
|
if(this.serverAuthenticationEntryPoint != null || this.defaultEntryPoints.isEmpty()) {
|
|
|
return this.serverAuthenticationEntryPoint;
|