This is an automated email from the ASF dual-hosted git repository.

jackie 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 08a3083b6a Adding RBAC authorization checks for multi-stage query 
engine (#11830)
08a3083b6a is described below

commit 08a3083b6a6242abd8e865b81a0ddc2c6dcdb340
Author: soumitra-st <[email protected]>
AuthorDate: Fri Oct 20 17:02:17 2023 -0700

    Adding RBAC authorization checks for multi-stage query engine (#11830)
---
 .../requesthandler/MultiStageBrokerRequestHandler.java      | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git 
a/pinot-broker/src/main/java/org/apache/pinot/broker/requesthandler/MultiStageBrokerRequestHandler.java
 
b/pinot-broker/src/main/java/org/apache/pinot/broker/requesthandler/MultiStageBrokerRequestHandler.java
index 5c4e86a7d4..772f021fce 100644
--- 
a/pinot-broker/src/main/java/org/apache/pinot/broker/requesthandler/MultiStageBrokerRequestHandler.java
+++ 
b/pinot-broker/src/main/java/org/apache/pinot/broker/requesthandler/MultiStageBrokerRequestHandler.java
@@ -30,6 +30,7 @@ import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
 import org.apache.calcite.jdbc.CalciteSchemaBuilder;
+import org.apache.pinot.broker.api.AccessControl;
 import org.apache.pinot.broker.api.RequesterIdentity;
 import org.apache.pinot.broker.broker.AccessControlFactory;
 import org.apache.pinot.broker.querylog.QueryLogger;
@@ -51,6 +52,8 @@ import org.apache.pinot.common.utils.DataSchema;
 import org.apache.pinot.common.utils.ExceptionUtils;
 import org.apache.pinot.common.utils.config.QueryOptionsUtils;
 import org.apache.pinot.common.utils.request.RequestUtils;
+import org.apache.pinot.core.auth.Actions;
+import org.apache.pinot.core.auth.TargetType;
 import org.apache.pinot.core.query.reduce.ExecutionStatsAggregator;
 import org.apache.pinot.core.transport.ServerInstance;
 import org.apache.pinot.query.QueryEnvironment;
@@ -128,7 +131,7 @@ public class MultiStageBrokerRequestHandler extends 
BaseBrokerRequestHandler {
           queryPlanResult = _queryEnvironment.explainQuery(query, 
sqlNodeAndOptions, requestId);
           String plan = queryPlanResult.getExplainPlan();
           Set<String> tableNames = queryPlanResult.getTableNames();
-          if (!hasTableAccess(requesterIdentity, tableNames, requestContext)) {
+          if (!hasTableAccess(requesterIdentity, tableNames, requestContext, 
httpHeaders)) {
             throw new WebApplicationException("Permission denied", 
Response.Status.FORBIDDEN);
           }
 
@@ -164,7 +167,7 @@ public class MultiStageBrokerRequestHandler extends 
BaseBrokerRequestHandler {
     updatePhaseTimingForTables(tableNames, 
BrokerQueryPhase.REQUEST_COMPILATION, compilationTimeNs);
 
     // Validate table access.
-    if (!hasTableAccess(requesterIdentity, tableNames, requestContext)) {
+    if (!hasTableAccess(requesterIdentity, tableNames, requestContext, 
httpHeaders)) {
       throw new WebApplicationException("Permission denied", 
Response.Status.FORBIDDEN);
     }
     updatePhaseTimingForTables(tableNames, BrokerQueryPhase.AUTHORIZATION, 
System.nanoTime() - compilationEndTimeNs);
@@ -251,8 +254,10 @@ public class MultiStageBrokerRequestHandler extends 
BaseBrokerRequestHandler {
    * Validates whether the requester has access to all the tables.
    */
   private boolean hasTableAccess(RequesterIdentity requesterIdentity, 
Set<String> tableNames,
-      RequestContext requestContext) {
-    boolean hasAccess = 
_accessControlFactory.create().hasAccess(requesterIdentity, tableNames);
+      RequestContext requestContext, HttpHeaders httpHeaders) {
+    AccessControl accessControl = _accessControlFactory.create();
+    boolean hasAccess = accessControl.hasAccess(requesterIdentity, tableNames) 
&& tableNames.stream()
+        .allMatch(table -> accessControl.hasAccess(httpHeaders, 
TargetType.TABLE, table, Actions.Table.QUERY));
     if (!hasAccess) {
       
_brokerMetrics.addMeteredGlobalValue(BrokerMeter.REQUEST_DROPPED_DUE_TO_ACCESS_ERROR,
 1);
       LOGGER.warn("Access denied for requestId {}", 
requestContext.getRequestId());


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to