浏览代码

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));
 				.add(getRequestMatcherPrivilegeEvaluatorsEntry(securityFilterChain));
 		}
 		}
 		boolean anyRequestConfigured = false;
 		boolean anyRequestConfigured = false;
-		RequestMatcher matcher = null;
 		for (SecurityBuilder<? extends SecurityFilterChain> securityFilterChainBuilder : this.securityFilterChainBuilders) {
 		for (SecurityBuilder<? extends SecurityFilterChain> securityFilterChainBuilder : this.securityFilterChainBuilders) {
 			SecurityFilterChain securityFilterChain = securityFilterChainBuilder.build();
 			SecurityFilterChain securityFilterChain = securityFilterChainBuilder.build();
 			Assert.isTrue(!anyRequestConfigured,
 			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.");
 							+ "] 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) {
 			if (securityFilterChain instanceof DefaultSecurityFilterChain defaultSecurityFilterChain) {
-				matcher = defaultSecurityFilterChain.getRequestMatcher();
-				if (matcher instanceof AnyRequestMatcher) {
+				if (defaultSecurityFilterChain.getRequestMatcher() instanceof AnyRequestMatcher) {
 					anyRequestConfigured = true;
 					anyRequestConfigured = true;
 				}
 				}
 			}
 			}