瀏覽代碼

Adjust any-request check

Storing the request matcher outside of the for loop means that
if one of the SecurityFilterChain instances is not of type
DefaultSecurityFilterChain, then the error may print out an
earlier request matcher instead of the current one.

Instead, this commit changes to print out the entire filter chain
so that it can be inside of the for loop, regardless of type.

Issue gh-15220
Josh Cummings 1 年之前
父節點
當前提交
0e7566ede3

+ 3 - 5
config/src/main/java/org/springframework/security/config/annotation/web/builders/WebSecurity.java

@@ -298,16 +298,14 @@ public final class WebSecurity extends AbstractConfiguredSecurityBuilder<Filter,
 				.add(getRequestMatcherPrivilegeEvaluatorsEntry(securityFilterChain));
 		}
 		boolean anyRequestConfigured = false;
-		RequestMatcher matcher = null;
 		for (SecurityBuilder<? extends SecurityFilterChain> securityFilterChainBuilder : this.securityFilterChainBuilders) {
 			SecurityFilterChain securityFilterChain = securityFilterChainBuilder.build();
 			Assert.isTrue(!anyRequestConfigured,
-					"A filter chain that matches any request has already been configured, which means that this filter chain for ["
-							+ matcher
+					"A filter chain that matches any request has already been configured, which means that this filter chain ["
+							+ securityFilterChain
 							+ "] will never get invoked. Please use `HttpSecurity#securityMatcher` to ensure that there is only one filter chain configured for 'any request' and that the 'any request' filter chain is published last.");
 			if (securityFilterChain instanceof DefaultSecurityFilterChain defaultSecurityFilterChain) {
-				matcher = defaultSecurityFilterChain.getRequestMatcher();
-				if (matcher instanceof AnyRequestMatcher) {
+				if (defaultSecurityFilterChain.getRequestMatcher() instanceof AnyRequestMatcher) {
 					anyRequestConfigured = true;
 				}
 			}