diff --git a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/ProxyConfiguration.java b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/ProxyConfiguration.java index c0f7096f98d9117fdbafd915d7f897d89d4a1342..6a293a0411965b6815541e280edd27d9d000f4a8 100644 --- a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/ProxyConfiguration.java +++ b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/ProxyConfiguration.java @@ -197,6 +197,12 @@ public class ProxyConfiguration implements PulsarConfiguration { + "to take effect" ) private boolean forwardAuthorizationCredentials = false; + @FieldContext( + category = CATEGORY_AUTHENTICATION, + doc = "Whether the '/metrics' endpoint requires authentication. Defaults to true." + + "'authenticationEnabled' must also be set for this to take effect." + ) + private boolean authenticateMetricsEndpoint = true; @FieldContext( diff --git a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/ProxyServiceStarter.java b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/ProxyServiceStarter.java index 3e48c0110e7c9c3f3ec552f5e53861d2e3d684d2..5a563e546b93d3d558e5615b1dd08629f2739155 100644 --- a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/ProxyServiceStarter.java +++ b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/ProxyServiceStarter.java @@ -45,6 +45,7 @@ import org.apache.pulsar.common.configuration.VipStatus; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.util.Collections; import java.util.Date; @@ -174,7 +175,7 @@ public class ProxyServiceStarter { static void addWebServerHandlers(WebServer server, ProxyConfiguration config, BrokerDiscoveryProvider discoveryProvider) { - server.addServlet("/metrics", new ServletHolder(MetricsServlet.class)); + server.addServlet("/metrics", new ServletHolder(MetricsServlet.class), Collections.emptyList(), config.isAuthenticateMetricsEndpoint()); server.addRestResources("/", VipStatus.class.getPackage().getName(), VipStatus.ATTRIBUTE_STATUS_FILE_PATH, config.getStatusFilePath()); diff --git a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/WebServer.java b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/WebServer.java index 2c4a4c2030b5b03986f9f14567d51c057662e65d..b4ebe356eee8d6390fc7c2090dba407411c8234f 100644 --- a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/WebServer.java +++ b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/WebServer.java @@ -127,6 +127,10 @@ public class WebServer { } public void addServlet(String basePath, ServletHolder servletHolder, List> attributes) { + addServlet(basePath, servletHolder, attributes, true); + } + + public void addServlet(String basePath, ServletHolder servletHolder, List> attributes, boolean requireAuthentication) { Optional existingPath = servletPaths.stream().filter(p -> p.startsWith(basePath)).findFirst(); if (existingPath.isPresent()) { throw new IllegalArgumentException( @@ -140,7 +144,7 @@ public class WebServer { for (Pair attribute : attributes) { context.setAttribute(attribute.getLeft(), attribute.getRight()); } - if (config.isAuthenticationEnabled()) { + if (config.isAuthenticationEnabled() && requireAuthentication) { FilterHolder filter = new FilterHolder(new AuthenticationFilter(authenticationService)); context.addFilter(filter, MATCH_ALL, EnumSet.allOf(DispatcherType.class)); } diff --git a/site2/docs/reference-configuration.md b/site2/docs/reference-configuration.md index 11ee1d459a93d0bcb0aa14f29023149b20ea8da6..bb549ae167d442926c7ce920d19144f295d8a0e1 100644 --- a/site2/docs/reference-configuration.md +++ b/site2/docs/reference-configuration.md @@ -439,6 +439,7 @@ The [Pulsar proxy](concepts-architecture-overview.md#pulsar-proxy) can be config |servicePortTls| The port to use to server binary Protobuf TLS requests |6651| |statusFilePath| Path for the file used to determine the rotation status for the proxy instance when responding to service discovery health checks || |authenticationEnabled| Whether authentication is enabled for the Pulsar proxy |false| +|authenticateMetricsEndpoint| Whether the '/metrics' endpoint requires authentication. Defaults to true. 'authenticationEnabled' must also be set for this to take effect. |true| |authenticationProviders| Authentication provider name list (a comma-separated list of class names) || |authorizationEnabled| Whether authorization is enforced by the Pulsar proxy |false| |authorizationProvider| Authorization provider as a fully qualified class name |org.apache.pulsar.broker.authorization.PulsarAuthorizationProvider|