From e487a6b4990099d63a1e8118a95964a2461954fc Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Mon, 9 Mar 2026 11:25:39 +0100 Subject: [PATCH] Improve EndpointRequest matcher documentation Prior to this commit, `EndpointRequest` exposed factory methods for creating security matchers in the context of Actuator endpoints. This is using the popular pattern matching approach for security matchers. Such matchers are not as focused as method-level security and will match the endpoint path itself (`"actuator/endpoint"`) as well as everything beneath it (`"actuator/endpoint/**"`). This commit improves the Javadoc and reference documentation to make this behavior more explicit. Closes gh-49520 --- .../reference/pages/actuator/endpoints.adoc | 3 +++ .../actuate/web/reactive/EndpointRequest.java | 19 ++++++++++--------- .../actuate/web/servlet/EndpointRequest.java | 18 +++++++++--------- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/endpoints.adoc b/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/endpoints.adoc index 31f7874b26e..c231b03da80 100644 --- a/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/endpoints.adoc +++ b/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/endpoints.adoc @@ -248,6 +248,9 @@ The preceding example uses `EndpointRequest.toAnyEndpoint()` to match a request Several other matcher methods are also available on javadoc:org.springframework.boot.security.autoconfigure.actuate.web.servlet.EndpointRequest[]. See the xref:api:rest/actuator/index.adoc[API documentation] for details. +NOTE: When matching for Actuator endpoints, `EndpointRequest.to("endpoint")` will consider the endpoint root and all its subpaths, +effectively matching `"/actuator/endpoint/**"` even if the endpoint does not declare nested routes. + If you deploy applications behind a firewall, you may prefer that all your actuator endpoints can be accessed without requiring authentication. You can do so by changing the configprop:management.endpoints.web.exposure.include[] property, as follows: diff --git a/module/spring-boot-security/src/main/java/org/springframework/boot/security/autoconfigure/actuate/web/reactive/EndpointRequest.java b/module/spring-boot-security/src/main/java/org/springframework/boot/security/autoconfigure/actuate/web/reactive/EndpointRequest.java index 46601f6cccc..6cf0f6b9027 100644 --- a/module/spring-boot-security/src/main/java/org/springframework/boot/security/autoconfigure/actuate/web/reactive/EndpointRequest.java +++ b/module/spring-boot-security/src/main/java/org/springframework/boot/security/autoconfigure/actuate/web/reactive/EndpointRequest.java @@ -69,11 +69,12 @@ public final class EndpointRequest { } /** - * Returns a matcher that includes all {@link Endpoint actuator endpoints}. It also - * includes the links endpoint which is present at the base path of the actuator - * endpoints. The {@link EndpointServerWebExchangeMatcher#excluding(Class...) - * excluding} method can be used to further remove specific endpoints if required. For - * example:
+	 * Returns a matcher that includes all {@link Endpoint actuator endpoints} and
+	 * everything beneath them. It also includes the links endpoint which is present at
+	 * the base path of the actuator endpoints. The
+	 * {@link EndpointServerWebExchangeMatcher#excluding(Class...) excluding} method can
+	 * be used to further remove specific endpoints if required. For example:
+	 * 
 	 * EndpointRequest.toAnyEndpoint().excluding(ShutdownEndpoint.class)
 	 * 
* @return the configured {@link ServerWebExchangeMatcher} @@ -83,8 +84,8 @@ public final class EndpointRequest { } /** - * Returns a matcher that includes the specified {@link Endpoint actuator endpoints}. - * For example:
+	 * Returns a matcher that includes the specified {@link Endpoint actuator endpoints}
+	 * everything beneath them. For example: 
 	 * EndpointRequest.to(ShutdownEndpoint.class, HealthEndpoint.class)
 	 * 
* @param endpoints the endpoints to include @@ -95,8 +96,8 @@ public final class EndpointRequest { } /** - * Returns a matcher that includes the specified {@link Endpoint actuator endpoints}. - * For example:
+	 * Returns a matcher that includes the specified {@link Endpoint actuator endpoints}
+	 * everything beneath them. For example: 
 	 * EndpointRequest.to("shutdown", "health")
 	 * 
* @param endpoints the endpoints to include diff --git a/module/spring-boot-security/src/main/java/org/springframework/boot/security/autoconfigure/actuate/web/servlet/EndpointRequest.java b/module/spring-boot-security/src/main/java/org/springframework/boot/security/autoconfigure/actuate/web/servlet/EndpointRequest.java index 3f6f50a03f0..b78109e3598 100644 --- a/module/spring-boot-security/src/main/java/org/springframework/boot/security/autoconfigure/actuate/web/servlet/EndpointRequest.java +++ b/module/spring-boot-security/src/main/java/org/springframework/boot/security/autoconfigure/actuate/web/servlet/EndpointRequest.java @@ -67,11 +67,11 @@ public final class EndpointRequest { } /** - * Returns a matcher that includes all {@link Endpoint actuator endpoints}. It also - * includes the links endpoint which is present at the base path of the actuator - * endpoints. The {@link EndpointRequestMatcher#excluding(Class...) excluding} method - * can be used to further remove specific endpoints if required. For example: - *
+	 * Returns a matcher that includes all {@link Endpoint actuator endpoints} and
+	 * everything beneath them. It also includes the links endpoint which is present at
+	 * the base path of the actuator endpoints. The
+	 * {@link EndpointRequestMatcher#excluding(Class...) excluding} method can be used to
+	 * further remove specific endpoints if required. For example: 
 	 * EndpointRequest.toAnyEndpoint().excluding(ShutdownEndpoint.class)
 	 * 
* @return the configured {@link RequestMatcher} @@ -81,8 +81,8 @@ public final class EndpointRequest { } /** - * Returns a matcher that includes the specified {@link Endpoint actuator endpoints}. - * For example:
+	 * Returns a matcher that includes the specified {@link Endpoint actuator endpoints}
+	 * and everything beneath them. For example: 
 	 * EndpointRequest.to(ShutdownEndpoint.class, HealthEndpoint.class)
 	 * 
* @param endpoints the endpoints to include @@ -93,8 +93,8 @@ public final class EndpointRequest { } /** - * Returns a matcher that includes the specified {@link Endpoint actuator endpoints}. - * For example:
+	 * Returns a matcher that includes the specified {@link Endpoint actuator endpoints}
+	 * and everything beneath them. For example: 
 	 * EndpointRequest.to("shutdown", "health")
 	 * 
* @param endpoints the endpoints to include