This is an automated email from the ASF dual-hosted git repository. xiangfu pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/pinot.git
The following commit(s) were added to refs/heads/master by this push: new 7ff7270210 Support GrpcRequesterIdentity in ZkBasicAuthAccessControlFactory (#16194) 7ff7270210 is described below commit 7ff72702103b7152fcb7c8a13094169b25bea5c3 Author: Xiang Fu <xiangfu.1...@gmail.com> AuthorDate: Wed Jun 25 16:35:13 2025 +0800 Support GrpcRequesterIdentity in ZkBasicAuthAccessControlFactory (#16194) --- .../pinot/broker/broker/AccessControlFactory.java | 33 ++++++++++++++++++++-- .../broker/BasicAuthAccessControlFactory.java | 26 ++--------------- .../broker/ZkBasicAuthAccessControlFactory.java | 14 ++++----- 3 files changed, 38 insertions(+), 35 deletions(-) diff --git a/pinot-broker/src/main/java/org/apache/pinot/broker/broker/AccessControlFactory.java b/pinot-broker/src/main/java/org/apache/pinot/broker/broker/AccessControlFactory.java index 46204fcf9c..40bbc862ca 100644 --- a/pinot-broker/src/main/java/org/apache/pinot/broker/broker/AccessControlFactory.java +++ b/pinot-broker/src/main/java/org/apache/pinot/broker/broker/AccessControlFactory.java @@ -18,9 +18,15 @@ */ package org.apache.pinot.broker.broker; +import com.google.common.base.Preconditions; +import java.util.Collection; +import java.util.List; import org.apache.helix.store.zk.ZkHelixPropertyStore; import org.apache.helix.zookeeper.datamodel.ZNRecord; import org.apache.pinot.broker.api.AccessControl; +import org.apache.pinot.broker.api.HttpRequesterIdentity; +import org.apache.pinot.broker.grpc.GrpcRequesterIdentity; +import org.apache.pinot.spi.auth.broker.RequesterIdentity; import org.apache.pinot.spi.env.PinotConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,9 +35,10 @@ import org.slf4j.LoggerFactory; public abstract class AccessControlFactory { public static final Logger LOGGER = LoggerFactory.getLogger(AccessControlFactory.class); public static final String ACCESS_CONTROL_CLASS_CONFIG = "class"; + public static final String HEADER_AUTHORIZATION = "authorization"; public void init(PinotConfiguration configuration) { - }; + } /** * Extend original init method inorder to support Zookeeper BasicAuthAccessControlFactory @@ -41,7 +48,7 @@ public abstract class AccessControlFactory { * @param propertyStore Helix PropertyStore */ public void init(PinotConfiguration configuration, ZkHelixPropertyStore<ZNRecord> propertyStore) { - init(configuration); + init(configuration); } public abstract AccessControl create(); @@ -63,4 +70,26 @@ public abstract class AccessControlFactory { throw new RuntimeException(e); } } + + public static Collection<String> extractAuthorizationTokens(RequesterIdentity requesterIdentity) { + Preconditions.checkArgument(requesterIdentity instanceof HttpRequesterIdentity + || requesterIdentity instanceof GrpcRequesterIdentity, + "HttpRequesterIdentity or GrpcRequesterIdentity required"); + + if (requesterIdentity instanceof HttpRequesterIdentity) { + HttpRequesterIdentity identity = (HttpRequesterIdentity) requesterIdentity; + return identity.getHttpHeaders().get(HEADER_AUTHORIZATION); + } + + if (requesterIdentity instanceof GrpcRequesterIdentity) { + GrpcRequesterIdentity identity = (GrpcRequesterIdentity) requesterIdentity; + for (String key : identity.getMetadata().keySet()) { + if (HEADER_AUTHORIZATION.equalsIgnoreCase(key)) { + return identity.getMetadata().get(key); + } + } + } + + return List.of(); + } } diff --git a/pinot-broker/src/main/java/org/apache/pinot/broker/broker/BasicAuthAccessControlFactory.java b/pinot-broker/src/main/java/org/apache/pinot/broker/broker/BasicAuthAccessControlFactory.java index 64a43517a0..129ac75f29 100644 --- a/pinot-broker/src/main/java/org/apache/pinot/broker/broker/BasicAuthAccessControlFactory.java +++ b/pinot-broker/src/main/java/org/apache/pinot/broker/broker/BasicAuthAccessControlFactory.java @@ -18,7 +18,6 @@ */ package org.apache.pinot.broker.broker; -import com.google.common.base.Preconditions; import java.util.Collection; import java.util.HashSet; import java.util.Map; @@ -28,8 +27,6 @@ import java.util.Set; import java.util.stream.Collectors; import javax.ws.rs.NotAuthorizedException; import org.apache.pinot.broker.api.AccessControl; -import org.apache.pinot.broker.api.HttpRequesterIdentity; -import org.apache.pinot.broker.grpc.GrpcRequesterIdentity; import org.apache.pinot.common.request.BrokerRequest; import org.apache.pinot.core.auth.BasicAuthPrincipal; import org.apache.pinot.core.auth.BasicAuthUtils; @@ -53,8 +50,6 @@ import org.apache.pinot.spi.env.PinotConfiguration; public class BasicAuthAccessControlFactory extends AccessControlFactory { private static final String PREFIX = "principals"; - private static final String HEADER_AUTHORIZATION = "authorization"; - private AccessControl _accessControl; public BasicAuthAccessControlFactory() { @@ -137,25 +132,8 @@ public class BasicAuthAccessControlFactory extends AccessControlFactory { } private Optional<BasicAuthPrincipal> getPrincipalOpt(RequesterIdentity requesterIdentity) { - Preconditions.checkArgument( - requesterIdentity instanceof HttpRequesterIdentity || requesterIdentity instanceof GrpcRequesterIdentity, - "BasicAuthAccessControl only supports HttpRequesterIdentity or GrpcRequesterIdentity, got %s", - requesterIdentity == null ? "null" : requesterIdentity.getClass().getName()); - Collection<String> tokens = null; - if (requesterIdentity instanceof HttpRequesterIdentity) { - HttpRequesterIdentity identity = (HttpRequesterIdentity) requesterIdentity; - tokens = identity.getHttpHeaders().get(HEADER_AUTHORIZATION); - } - if (requesterIdentity instanceof GrpcRequesterIdentity) { - GrpcRequesterIdentity identity = (GrpcRequesterIdentity) requesterIdentity; - for (String key : identity.getMetadata().keySet()) { - if (HEADER_AUTHORIZATION.equalsIgnoreCase(key)) { - tokens = identity.getMetadata().get(key); - break; - } - } - } - if (tokens == null || tokens.isEmpty()) { + Collection<String> tokens = extractAuthorizationTokens(requesterIdentity); + if (tokens.isEmpty()) { return Optional.empty(); } return tokens.stream().map(org.apache.pinot.common.auth.BasicAuthUtils::normalizeBase64Token) diff --git a/pinot-broker/src/main/java/org/apache/pinot/broker/broker/ZkBasicAuthAccessControlFactory.java b/pinot-broker/src/main/java/org/apache/pinot/broker/broker/ZkBasicAuthAccessControlFactory.java index 645591386b..940760a590 100644 --- a/pinot-broker/src/main/java/org/apache/pinot/broker/broker/ZkBasicAuthAccessControlFactory.java +++ b/pinot-broker/src/main/java/org/apache/pinot/broker/broker/ZkBasicAuthAccessControlFactory.java @@ -18,7 +18,6 @@ */ package org.apache.pinot.broker.broker; -import com.google.common.base.Preconditions; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -31,7 +30,6 @@ import javax.ws.rs.NotAuthorizedException; import org.apache.helix.store.zk.ZkHelixPropertyStore; import org.apache.helix.zookeeper.datamodel.ZNRecord; import org.apache.pinot.broker.api.AccessControl; -import org.apache.pinot.broker.api.HttpRequesterIdentity; import org.apache.pinot.common.config.provider.AccessControlUserCache; import org.apache.pinot.common.request.BrokerRequest; import org.apache.pinot.common.utils.BcryptUtils; @@ -55,7 +53,6 @@ import org.apache.pinot.spi.utils.builder.TableNameBuilder; * */ public class ZkBasicAuthAccessControlFactory extends AccessControlFactory { - private static final String HEADER_AUTHORIZATION = "authorization"; private AccessControl _accessControl; @@ -124,10 +121,10 @@ public class ZkBasicAuthAccessControlFactory extends AccessControlFactory { } private Optional<ZkBasicAuthPrincipal> getPrincipalAuth(RequesterIdentity requesterIdentity) { - Preconditions.checkArgument(requesterIdentity instanceof HttpRequesterIdentity, "HttpRequesterIdentity required"); - HttpRequesterIdentity identity = (HttpRequesterIdentity) requesterIdentity; - - Collection<String> tokens = identity.getHttpHeaders().get(HEADER_AUTHORIZATION); + Collection<String> tokens = extractAuthorizationTokens(requesterIdentity); + if (tokens.isEmpty()) { + return Optional.empty(); + } _name2principal = BasicAuthUtils.extractBasicAuthPrincipals(_userCache.getAllBrokerUserConfig()).stream() .collect(Collectors.toMap(BasicAuthPrincipal::getName, p -> p)); @@ -138,10 +135,9 @@ public class ZkBasicAuthAccessControlFactory extends AccessControlFactory { Map<String, ZkBasicAuthPrincipal> password2principal = name2password.keySet().stream().collect(Collectors.toMap(name2password::get, _name2principal::get)); - Optional<ZkBasicAuthPrincipal> principalOpt = password2principal.entrySet().stream().filter( + return password2principal.entrySet().stream().filter( entry -> BcryptUtils.checkpwWithCache(entry.getKey(), entry.getValue().getPassword(), _userCache.getUserPasswordAuthCache())).map(u -> u.getValue()).filter(Objects::nonNull).findFirst(); - return principalOpt; } } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org