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

roryqi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new be8e1519f3 [#6695] fix(authz): Fix the error privileges (#6821)
be8e1519f3 is described below

commit be8e1519f31d1588b0ed96d70739d28e15a13ada
Author: roryqi <h...@datastrato.com>
AuthorDate: Wed Apr 9 10:08:37 2025 +0800

    [#6695] fix(authz): Fix the error privileges (#6821)
    
    ### What changes were proposed in this pull request?
    
    Fix the error privileges.
    
    ### Why are the changes needed?
    
    Fix: #6695
    
    ### Does this PR introduce _any_ user-facing change?
    
    No.
    
    ### How was this patch tested?
    
    Add UT.
---
 .../common/PathBasedMetadataObject.java            |  15 ++
 .../common/PathBasedSecurableObject.java           |   3 +-
 .../ranger/RangerAuthorizationHDFSPlugin.java      | 238 ++++++++++++++-------
 .../ranger/RangerAuthorizationHadoopSQLPlugin.java |  35 +--
 .../ranger/RangerAuthorizationPlugin.java          |   5 +-
 .../test/RangerAuthorizationHDFSPluginIT.java      | 122 +++++++++--
 .../ranger/integration/test/RangerHiveIT.java      |   5 +-
 .../ranger/integration/test/RangerITEnv.java       |   4 +-
 8 files changed, 296 insertions(+), 131 deletions(-)

diff --git 
a/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/common/PathBasedMetadataObject.java
 
b/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/common/PathBasedMetadataObject.java
index 7b65fbd56f..c3bae05327 100644
--- 
a/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/common/PathBasedMetadataObject.java
+++ 
b/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/common/PathBasedMetadataObject.java
@@ -92,15 +92,26 @@ public class PathBasedMetadataObject implements 
AuthorizationMetadataObject {
   private final String name;
   private final String parent;
   private final String path;
+  private final boolean recursive;
 
   private final AuthorizationMetadataObject.Type type;
 
   public PathBasedMetadataObject(
       String parent, String name, String path, 
AuthorizationMetadataObject.Type type) {
+    this(parent, name, path, type, true);
+  }
+
+  public PathBasedMetadataObject(
+      String parent,
+      String name,
+      String path,
+      AuthorizationMetadataObject.Type type,
+      boolean recursive) {
     this.parent = parent;
     this.name = name;
     this.path = path;
     this.type = type;
+    this.recursive = recursive;
   }
 
   @Override
@@ -122,6 +133,10 @@ public class PathBasedMetadataObject implements 
AuthorizationMetadataObject {
     return path;
   }
 
+  public boolean recursive() {
+    return recursive;
+  }
+
   @Override
   public AuthorizationMetadataObject.Type type() {
     return this.type;
diff --git 
a/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/common/PathBasedSecurableObject.java
 
b/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/common/PathBasedSecurableObject.java
index aa2262fb16..5e61e4a701 100644
--- 
a/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/common/PathBasedSecurableObject.java
+++ 
b/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/common/PathBasedSecurableObject.java
@@ -35,8 +35,9 @@ public class PathBasedSecurableObject extends 
PathBasedMetadataObject
       String name,
       String path,
       AuthorizationMetadataObject.Type type,
+      boolean recursive,
       Set<AuthorizationPrivilege> privileges) {
-    super(parent, name, path, type);
+    super(parent, name, path, type, recursive);
     this.privileges = ImmutableList.copyOf(privileges);
   }
 
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHDFSPlugin.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHDFSPlugin.java
index 588e5df18a..ccc7326b8c 100644
--- 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHDFSPlugin.java
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHDFSPlugin.java
@@ -107,6 +107,12 @@ public class RangerAuthorizationHDFSPlugin extends 
RangerAuthorizationPlugin {
             RangerPrivileges.RangerHdfsPrivilege.EXECUTE),
         Privilege.Name.WRITE_FILESET,
         ImmutableSet.of(
+            RangerPrivileges.RangerHdfsPrivilege.READ,
+            RangerPrivileges.RangerHdfsPrivilege.WRITE,
+            RangerPrivileges.RangerHdfsPrivilege.EXECUTE),
+        Privilege.Name.CREATE_FILESET,
+        ImmutableSet.of(
+            RangerPrivileges.RangerHdfsPrivilege.READ,
             RangerPrivileges.RangerHdfsPrivilege.WRITE,
             RangerPrivileges.RangerHdfsPrivilege.EXECUTE));
   }
@@ -252,11 +258,11 @@ public class RangerAuthorizationHDFSPlugin extends 
RangerAuthorizationPlugin {
    */
   @Override
   protected void removeMetadataObject(AuthorizationMetadataObject 
authzMetadataObject) {
-    if 
(authzMetadataObject.type().equals(PathBasedMetadataObject.SCHEMA_PATH)) {
+    if (authzMetadataObject.metadataObjectType() == 
MetadataObject.Type.SCHEMA) {
       removeSchemaMetadataObject(authzMetadataObject);
-    } else if 
(authzMetadataObject.type().equals(PathBasedMetadataObject.TABLE_PATH)) {
+    } else if (authzMetadataObject.metadataObjectType() == 
MetadataObject.Type.TABLE) {
       removeTableMetadataObject(authzMetadataObject);
-    } else if 
(authzMetadataObject.type().equals(PathBasedMetadataObject.FILESET_PATH)) {
+    } else if (authzMetadataObject.metadataObjectType() == 
MetadataObject.Type.FILESET) {
       removePolicyByMetadataObject(authzMetadataObject);
     } else if (authzMetadataObject.metadataObjectType() == 
MetadataObject.Type.METALAKE
         || authzMetadataObject.metadataObjectType() == 
MetadataObject.Type.CATALOG) {
@@ -305,29 +311,26 @@ public class RangerAuthorizationHDFSPlugin extends 
RangerAuthorizationPlugin {
     policy.setName(getAuthorizationPath(pathBasedMetadataObject));
     RangerPolicy.RangerPolicyResource policyResource =
         new RangerPolicy.RangerPolicyResource(
-            getAuthorizationPath(pathBasedMetadataObject), false, true);
+            getAuthorizationPath(pathBasedMetadataObject),
+            false,
+            pathBasedMetadataObject.recursive());
     policy.getResources().put(RangerDefines.PolicyResource.PATH.getName(), 
policyResource);
     return policy;
   }
 
   @Override
   public AuthorizationSecurableObject generateAuthorizationSecurableObject(
-      List<String> names,
-      String path,
-      AuthorizationMetadataObject.Type type,
-      Set<AuthorizationPrivilege> privileges) {
-    AuthorizationMetadataObject authMetadataObject =
-        new PathBasedMetadataObject(
-            AuthorizationMetadataObject.getParentFullName(names),
-            AuthorizationMetadataObject.getLastName(names),
-            path,
-            type);
-    authMetadataObject.validateAuthorizationMetadataObject();
+      AuthorizationMetadataObject object, Set<AuthorizationPrivilege> 
privileges) {
+    object.validateAuthorizationMetadataObject();
+    Preconditions.checkArgument(
+        object instanceof PathBasedMetadataObject, "Object must be a path 
based metadata object");
+    PathBasedMetadataObject metadataObject = (PathBasedMetadataObject) object;
     return new PathBasedSecurableObject(
-        authMetadataObject.parent(),
-        authMetadataObject.name(),
-        path,
-        authMetadataObject.type(),
+        metadataObject.parent(),
+        metadataObject.name(),
+        metadataObject.path(),
+        metadataObject.type(),
+        metadataObject.recursive(),
         privileges);
   }
 
@@ -388,7 +391,11 @@ public class RangerAuthorizationHDFSPlugin extends 
RangerAuthorizationPlugin {
                   switch (securableObject.type()) {
                     case METALAKE:
                       extractMetalakeLocations(
-                          securableObject, identifier, rangerSecurableObjects, 
rangerPrivileges);
+                          securableObject,
+                          identifier,
+                          rangerSecurableObjects,
+                          rangerPrivileges,
+                          true);
                       break;
                     case CATALOG:
                     case SCHEMA:
@@ -400,7 +407,8 @@ public class RangerAuthorizationHDFSPlugin extends 
RangerAuthorizationPlugin {
                                     securableObject,
                                     locationPath,
                                     rangerSecurableObjects,
-                                    rangerPrivileges);
+                                    rangerPrivileges,
+                                    true);
                               });
                       break;
                     default:
@@ -414,7 +422,11 @@ public class RangerAuthorizationHDFSPlugin extends 
RangerAuthorizationPlugin {
                   switch (securableObject.type()) {
                     case METALAKE:
                       extractMetalakeLocations(
-                          securableObject, identifier, rangerSecurableObjects, 
rangerPrivileges);
+                          securableObject,
+                          identifier,
+                          rangerSecurableObjects,
+                          rangerPrivileges,
+                          false);
                       break;
                     case CATALOG:
                       AuthorizationUtils.getMetadataObjectLocation(
@@ -425,7 +437,8 @@ public class RangerAuthorizationHDFSPlugin extends 
RangerAuthorizationPlugin {
                                       securableObject,
                                       locationPath,
                                       rangerSecurableObjects,
-                                      rangerPrivileges));
+                                      rangerPrivileges,
+                                      false));
                       break;
                     default:
                       throw new AuthorizationPluginException(
@@ -435,54 +448,36 @@ public class RangerAuthorizationHDFSPlugin extends 
RangerAuthorizationPlugin {
                   }
                   break;
                 case SELECT_TABLE:
-                case CREATE_TABLE:
                 case MODIFY_TABLE:
-                  AuthorizationUtils.getMetadataObjectLocation(
-                          identifier, 
MetadataObjectUtil.toEntityType(securableObject))
-                      .forEach(
-                          locationPath -> {
-                            PathBasedMetadataObject pathBaseMetadataObject =
-                                new PathBasedMetadataObject(
-                                    securableObject.parent(),
-                                    securableObject.name(),
-                                    locationPath,
-                                    
PathBasedMetadataObject.PathType.get(securableObject.type()));
-                            
pathBaseMetadataObject.validateAuthorizationMetadataObject();
-                            rangerSecurableObjects.add(
-                                generateAuthorizationSecurableObject(
-                                    pathBaseMetadataObject.names(),
-                                    locationPath,
-                                    
PathBasedMetadataObject.PathType.get(securableObject.type()),
-                                    rangerPrivileges));
-                          });
-                  break;
-                case CREATE_FILESET:
-                  // Ignore the Gravitino privilege `CREATE_FILESET` in the
-                  // RangerAuthorizationHDFSPlugin
-                  break;
                 case READ_FILESET:
                 case WRITE_FILESET:
+                  if (!gravitinoPrivilege.canBindTo(securableObject.type())) {
+                    throw new AuthorizationPluginException(
+                        ErrorMessages.PRIVILEGE_NOT_SUPPORTED,
+                        gravitinoPrivilege.name(),
+                        securableObject.type());
+                  }
+                  createSecurableObjects(
+                      securableObject,
+                      rangerSecurableObjects,
+                      identifier,
+                      rangerPrivileges,
+                      true,
+                      new TableOrFilesetPathExtractor());
+                  break;
+                case CREATE_TABLE:
+                case CREATE_FILESET:
                   switch (securableObject.type()) {
                     case METALAKE:
                     case CATALOG:
                     case SCHEMA:
-                      break;
-                    case FILESET:
-                      translateMetadataObject(securableObject)
-                          .forEach(
-                              metadataObject -> {
-                                Preconditions.checkArgument(
-                                    metadataObject instanceof 
PathBasedMetadataObject,
-                                    "The metadata object must be a 
PathBasedMetadataObject");
-                                PathBasedMetadataObject 
pathBasedMetadataObject =
-                                    (PathBasedMetadataObject) metadataObject;
-                                rangerSecurableObjects.add(
-                                    generateAuthorizationSecurableObject(
-                                        pathBasedMetadataObject.names(),
-                                        
getAuthorizationPath(pathBasedMetadataObject),
-                                        PathBasedMetadataObject.FILESET_PATH,
-                                        rangerPrivileges));
-                              });
+                      createSecurableObjects(
+                          securableObject,
+                          rangerSecurableObjects,
+                          identifier,
+                          rangerPrivileges,
+                          false,
+                          new SchemaPathExtractor());
                       break;
                     default:
                       throw new AuthorizationPluginException(
@@ -502,11 +497,50 @@ public class RangerAuthorizationHDFSPlugin extends 
RangerAuthorizationPlugin {
     return rangerSecurableObjects;
   }
 
+  private void createSecurableObjects(
+      SecurableObject securableObject,
+      List<AuthorizationSecurableObject> rangerSecurableObjects,
+      NameIdentifier identifier,
+      Set<AuthorizationPrivilege> rangerPrivileges,
+      boolean recursive,
+      PathExtractor pathExtractor) {
+    Entity.EntityType type = MetadataObjectUtil.toEntityType(securableObject);
+    List<String> locations = Lists.newArrayList();
+    if (type == Entity.EntityType.METALAKE) {
+      NameIdentifier[] catalogs =
+          GravitinoEnv.getInstance()
+              .catalogDispatcher()
+              .listCatalogs(Namespace.of(identifier.name()));
+      for (NameIdentifier catalog : catalogs) {
+        locations.addAll(
+            AuthorizationUtils.getMetadataObjectLocation(catalog, 
Entity.EntityType.CATALOG));
+      }
+    } else {
+      
locations.addAll(AuthorizationUtils.getMetadataObjectLocation(identifier, 
type));
+    }
+
+    locations.forEach(
+        locationPath -> {
+          PathBasedMetadataObject pathBaseMetadataObject =
+              new PathBasedMetadataObject(
+                  securableObject.parent(),
+                  securableObject.name(),
+                  pathExtractor.getPath(
+                      MetadataObjectUtil.toEntityType(securableObject), 
locationPath),
+                  PathBasedMetadataObject.PathType.get(securableObject.type()),
+                  recursive);
+          pathBaseMetadataObject.validateAuthorizationMetadataObject();
+          rangerSecurableObjects.add(
+              generateAuthorizationSecurableObject(pathBaseMetadataObject, 
rangerPrivileges));
+        });
+  }
+
   private void extractMetalakeLocations(
       SecurableObject securableObject,
       NameIdentifier identifier,
       List<AuthorizationSecurableObject> rangerSecurableObjects,
-      Set<AuthorizationPrivilege> rangerPrivileges) {
+      Set<AuthorizationPrivilege> rangerPrivileges,
+      boolean recursive) {
     NameIdentifier[] catalogs =
         GravitinoEnv.getInstance()
             .catalogDispatcher()
@@ -516,7 +550,11 @@ public class RangerAuthorizationHDFSPlugin extends 
RangerAuthorizationPlugin {
           .forEach(
               locationPath ->
                   createPathBasedMetadataObject(
-                      securableObject, locationPath, rangerSecurableObjects, 
rangerPrivileges));
+                      securableObject,
+                      locationPath,
+                      rangerSecurableObjects,
+                      rangerPrivileges,
+                      recursive));
     }
   }
 
@@ -524,18 +562,18 @@ public class RangerAuthorizationHDFSPlugin extends 
RangerAuthorizationPlugin {
       SecurableObject securableObject,
       String locationPath,
       List<AuthorizationSecurableObject> rangerSecurableObjects,
-      Set<AuthorizationPrivilege> rangerPrivileges) {
+      Set<AuthorizationPrivilege> rangerPrivileges,
+      boolean recursive) {
     PathBasedMetadataObject pathBaseMetadataObject =
         new PathBasedMetadataObject(
             securableObject.parent(),
             securableObject.name(),
             locationPath,
-            PathBasedMetadataObject.PathType.get(securableObject.type()));
+            PathBasedMetadataObject.PathType.get(securableObject.type()),
+            recursive);
     pathBaseMetadataObject.validateAuthorizationMetadataObject();
     rangerSecurableObjects.add(
-        generateAuthorizationSecurableObject(
-            pathBaseMetadataObject.names(), locationPath,
-            PathBasedMetadataObject.PathType.get(securableObject.type()), 
rangerPrivileges));
+        generateAuthorizationSecurableObject(pathBaseMetadataObject, 
rangerPrivileges));
   }
 
   @Override
@@ -558,10 +596,7 @@ public class RangerAuthorizationHDFSPlugin extends 
RangerAuthorizationPlugin {
                       (PathBasedMetadataObject) metadataObject;
                   rangerSecurableObjects.add(
                       generateAuthorizationSecurableObject(
-                          pathBasedMetadataObject.names(),
-                          getAuthorizationPath(pathBasedMetadataObject),
-                          pathBasedMetadataObject.type(),
-                          ownerMappingRule()));
+                          pathBasedMetadataObject, ownerMappingRule()));
                 });
         break;
       default:
@@ -581,6 +616,7 @@ public class RangerAuthorizationHDFSPlugin extends 
RangerAuthorizationPlugin {
             ? NameIdentifier.of(metadataObject.fullName())
             : NameIdentifier.parse(String.join(".", metalake, 
metadataObject.fullName()));
     List<String> locations = 
AuthorizationUtils.getMetadataObjectLocation(identifier, entityType);
+
     locations.forEach(
         locationPath -> {
           AuthorizationMetadataObject.Type type =
@@ -740,4 +776,56 @@ public class RangerAuthorizationHDFSPlugin extends 
RangerAuthorizationPlugin {
                 RangerAuthorizationProperties.FS_DEFAULT_VALUE))
         .build();
   }
+
+  private interface PathExtractor {
+    String getPath(Entity.EntityType type, String location);
+  }
+
+  /** The extractor will extra the table or fileset level location path for 
this entity */
+  private static class TableOrFilesetPathExtractor implements PathExtractor {
+    /**
+     * This method will return table or fileset level path for this entity
+     *
+     * @param type The entity type
+     * @param location The location of this entity
+     * @return The table or file locations of this entity
+     */
+    @Override
+    public String getPath(Entity.EntityType type, String location) {
+      if (type == Entity.EntityType.CATALOG) {
+        return String.format("%s/*/*/", location);
+      } else if (type == Entity.EntityType.SCHEMA) {
+        return String.format("%s/*/", location);
+      }
+      if (type == Entity.EntityType.TABLE || type == 
Entity.EntityType.FILESET) {
+        return location;
+      } else {
+        throw new AuthorizationPluginException(
+            "It's not allowed to extract table or fileset path from entity 
%s", type);
+      }
+    }
+  }
+
+  /** The extractor will extra the schema level location path for this entity 
*/
+  private static class SchemaPathExtractor implements PathExtractor {
+
+    /**
+     * This method will return schema level path for this entity
+     *
+     * @param type The entity type
+     * @param location The location of this entity
+     * @return The schema locations of this entity
+     */
+    @Override
+    public String getPath(Entity.EntityType type, String location) {
+      if (type == Entity.EntityType.CATALOG) {
+        return String.format("%s/*/", location);
+      } else if (type == Entity.EntityType.SCHEMA) {
+        return location;
+      } else {
+        throw new AuthorizationPluginException(
+            "It's not allowed to extract table or fileset path from entity 
%s", type);
+      }
+    }
+  }
 }
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHadoopSQLPlugin.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHadoopSQLPlugin.java
index d519dd2e52..315febcba7 100644
--- 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHadoopSQLPlugin.java
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHadoopSQLPlugin.java
@@ -396,23 +396,24 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
     return policy;
   }
 
-  @Override
   public AuthorizationSecurableObject generateAuthorizationSecurableObject(
       List<String> names,
-      String path,
       AuthorizationMetadataObject.Type type,
       Set<AuthorizationPrivilege> privileges) {
-    AuthorizationMetadataObject authMetadataObject =
+    RangerHadoopSQLMetadataObject object =
         new RangerHadoopSQLMetadataObject(
             AuthorizationMetadataObject.getParentFullName(names),
             AuthorizationMetadataObject.getLastName(names),
             type);
-    authMetadataObject.validateAuthorizationMetadataObject();
+    return generateAuthorizationSecurableObject(object, privileges);
+  }
+
+  @Override
+  public AuthorizationSecurableObject generateAuthorizationSecurableObject(
+      AuthorizationMetadataObject object, Set<AuthorizationPrivilege> 
privileges) {
+    object.validateAuthorizationMetadataObject();
     return new RangerHadoopSQLSecurableObject(
-        authMetadataObject.parent(),
-        authMetadataObject.name(),
-        authMetadataObject.type(),
-        privileges);
+        object.parent(), object.name(), object.type(), privileges);
   }
 
   @Override
@@ -455,14 +456,12 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
         rangerSecurableObjects.add(
             generateAuthorizationSecurableObject(
                 ImmutableList.of(RangerHelper.RESOURCE_ALL),
-                null,
                 RangerHadoopSQLMetadataObject.Type.SCHEMA,
                 ownerMappingRule()));
         // Add `*.*` for the TABLE permission
         rangerSecurableObjects.add(
             generateAuthorizationSecurableObject(
                 ImmutableList.of(RangerHelper.RESOURCE_ALL, 
RangerHelper.RESOURCE_ALL),
-                null,
                 RangerHadoopSQLMetadataObject.Type.TABLE,
                 ownerMappingRule()));
         // Add `*.*.*` for the COLUMN permission
@@ -472,7 +471,6 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
                     RangerHelper.RESOURCE_ALL,
                     RangerHelper.RESOURCE_ALL,
                     RangerHelper.RESOURCE_ALL),
-                null,
                 RangerHadoopSQLMetadataObject.Type.COLUMN,
                 ownerMappingRule()));
         break;
@@ -481,7 +479,6 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
         rangerSecurableObjects.add(
             generateAuthorizationSecurableObject(
                 ImmutableList.of(gravitinoMetadataObject.name() /*Schema 
name*/),
-                null,
                 RangerHadoopSQLMetadataObject.Type.SCHEMA,
                 ownerMappingRule()));
         // Add `{schema}.*` for the TABLE permission
@@ -489,7 +486,6 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
             generateAuthorizationSecurableObject(
                 ImmutableList.of(
                     gravitinoMetadataObject.name() /*Schema name*/, 
RangerHelper.RESOURCE_ALL),
-                null,
                 RangerHadoopSQLMetadataObject.Type.TABLE,
                 ownerMappingRule()));
         // Add `{schema}.*.*` for the COLUMN permission
@@ -499,7 +495,6 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
                     gravitinoMetadataObject.name() /*Schema name*/,
                     RangerHelper.RESOURCE_ALL,
                     RangerHelper.RESOURCE_ALL),
-                null,
                 RangerHadoopSQLMetadataObject.Type.COLUMN,
                 ownerMappingRule()));
         break;
@@ -511,7 +506,6 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
                   rangerSecurableObjects.add(
                       generateAuthorizationSecurableObject(
                           rangerMetadataObject.names(),
-                          null,
                           RangerHadoopSQLMetadataObject.Type.TABLE,
                           ownerMappingRule()));
                   // Add `{schema}.{table}.*` for the COLUMN permission
@@ -521,7 +515,6 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
                                   rangerMetadataObject.names().stream(),
                                   Stream.of(RangerHelper.RESOURCE_ALL))
                               .collect(Collectors.toList()),
-                          null,
                           RangerHadoopSQLMetadataObject.Type.COLUMN,
                           ownerMappingRule()));
                 });
@@ -568,7 +561,6 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
                       rangerSecurableObjects.add(
                           generateAuthorizationSecurableObject(
                               ImmutableList.of(RangerHelper.RESOURCE_ALL),
-                              null,
                               RangerHadoopSQLMetadataObject.Type.SCHEMA,
                               rangerPrivileges));
                       break;
@@ -587,7 +579,6 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
                       rangerSecurableObjects.add(
                           generateAuthorizationSecurableObject(
                               ImmutableList.of(RangerHelper.RESOURCE_ALL),
-                              null,
                               RangerHadoopSQLMetadataObject.Type.SCHEMA,
                               rangerPrivileges));
                       break;
@@ -606,7 +597,6 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
                       rangerSecurableObjects.add(
                           generateAuthorizationSecurableObject(
                               ImmutableList.of(RangerHelper.RESOURCE_ALL),
-                              null,
                               RangerHadoopSQLMetadataObject.Type.SCHEMA,
                               rangerPrivileges));
                       break;
@@ -615,7 +605,6 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
                       rangerSecurableObjects.add(
                           generateAuthorizationSecurableObject(
                               ImmutableList.of(securableObject.name() /*Schema 
name*/),
-                              null,
                               RangerHadoopSQLMetadataObject.Type.SCHEMA,
                               rangerPrivileges));
                       break;
@@ -637,7 +626,6 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
                           generateAuthorizationSecurableObject(
                               ImmutableList.of(
                                   RangerHelper.RESOURCE_ALL, 
RangerHelper.RESOURCE_ALL),
-                              null,
                               RangerHadoopSQLMetadataObject.Type.TABLE,
                               rangerPrivileges));
                       // Add `*.*.*` for the COLUMN permission
@@ -647,7 +635,6 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
                                   RangerHelper.RESOURCE_ALL,
                                   RangerHelper.RESOURCE_ALL,
                                   RangerHelper.RESOURCE_ALL),
-                              null,
                               RangerHadoopSQLMetadataObject.Type.COLUMN,
                               rangerPrivileges));
                       break;
@@ -658,7 +645,6 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
                               ImmutableList.of(
                                   securableObject.name() /*Schema name*/,
                                   RangerHelper.RESOURCE_ALL),
-                              null,
                               RangerHadoopSQLMetadataObject.Type.TABLE,
                               rangerPrivileges));
                       // Add `{schema}.*.*` for the COLUMN permission
@@ -668,7 +654,6 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
                                   securableObject.name() /*Schema name*/,
                                   RangerHelper.RESOURCE_ALL,
                                   RangerHelper.RESOURCE_ALL),
-                              null,
                               RangerHadoopSQLMetadataObject.Type.COLUMN,
                               rangerPrivileges));
                       break;
@@ -686,7 +671,6 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
                                   rangerSecurableObjects.add(
                                       generateAuthorizationSecurableObject(
                                           rangerMetadataObject.names(),
-                                          null,
                                           
RangerHadoopSQLMetadataObject.Type.TABLE,
                                           rangerPrivileges));
                                   // Add `{schema}.{table}.*` for the COLUMN 
permission
@@ -696,7 +680,6 @@ public class RangerAuthorizationHadoopSQLPlugin extends 
RangerAuthorizationPlugi
                                                   
rangerMetadataObject.names().stream(),
                                                   
Stream.of(RangerHelper.RESOURCE_ALL))
                                               .collect(Collectors.toList()),
-                                          null,
                                           
RangerHadoopSQLMetadataObject.Type.COLUMN,
                                           rangerPrivileges));
                                 });
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationPlugin.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationPlugin.java
index 5007444e10..78a9a25596 100644
--- 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationPlugin.java
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationPlugin.java
@@ -1028,10 +1028,7 @@ public abstract class RangerAuthorizationPlugin
 
   /** Generate authorization securable object */
   public abstract AuthorizationSecurableObject 
generateAuthorizationSecurableObject(
-      List<String> names,
-      String path,
-      AuthorizationMetadataObject.Type type,
-      Set<AuthorizationPrivilege> privileges);
+      AuthorizationMetadataObject object, Set<AuthorizationPrivilege> 
privileges);
 
   public boolean validAuthorizationOperation(List<SecurableObject> 
securableObjects) {
     return securableObjects.stream()
diff --git 
a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerAuthorizationHDFSPluginIT.java
 
b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerAuthorizationHDFSPluginIT.java
index 056f5292b9..a50d677fef 100644
--- 
a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerAuthorizationHDFSPluginIT.java
+++ 
b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerAuthorizationHDFSPluginIT.java
@@ -18,10 +18,16 @@
  */
 package org.apache.gravitino.authorization.ranger.integration.test;
 
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import java.util.List;
+import org.apache.commons.lang3.reflect.FieldUtils;
 import org.apache.gravitino.Entity;
+import org.apache.gravitino.GravitinoEnv;
 import org.apache.gravitino.MetadataObject;
 import org.apache.gravitino.MetadataObjects;
 import org.apache.gravitino.NameIdentifier;
@@ -33,6 +39,7 @@ import org.apache.gravitino.authorization.SecurableObjects;
 import org.apache.gravitino.authorization.common.PathBasedMetadataObject;
 import org.apache.gravitino.authorization.common.PathBasedSecurableObject;
 import org.apache.gravitino.authorization.ranger.RangerAuthorizationPlugin;
+import org.apache.gravitino.catalog.CatalogDispatcher;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
@@ -45,11 +52,14 @@ import org.mockito.Mockito;
 public class RangerAuthorizationHDFSPluginIT {
 
   private static RangerAuthorizationPlugin rangerAuthPlugin;
+  private static final CatalogDispatcher manager = 
mock(CatalogDispatcher.class);
 
   @BeforeAll
-  public static void setup() {
+  public static void setup() throws Exception {
     RangerITEnv.init(RangerITEnv.currentFunName(), true);
     rangerAuthPlugin = RangerITEnv.rangerAuthHDFSPlugin;
+    FieldUtils.writeField(GravitinoEnv.getInstance(), "catalogDispatcher", 
manager, true);
+    when(manager.listCatalogs(any())).thenReturn(new NameIdentifier[0]);
   }
 
   @AfterAll
@@ -162,50 +172,122 @@ public class RangerAuthorizationHDFSPluginIT {
               rangerAuthPlugin.translatePrivilege(filesetInMetalake);
           Assertions.assertEquals(0, filesetInMetalake1.size());
 
-          SecurableObject filesetInCatalog =
+          SecurableObject catalogObject =
               SecurableObjects.parse(
                   "catalog1",
                   MetadataObject.Type.CATALOG,
                   Lists.newArrayList(
                       Privileges.CreateFileset.allow(),
                       Privileges.ReadFileset.allow(),
-                      Privileges.WriteFileset.allow()));
-          List<AuthorizationSecurableObject> filesetInCatalog1 =
-              rangerAuthPlugin.translatePrivilege(filesetInCatalog);
-          Assertions.assertEquals(0, filesetInCatalog1.size());
+                      Privileges.WriteFileset.allow(),
+                      Privileges.CreateTable.allow(),
+                      Privileges.SelectTable.allow(),
+                      Privileges.ModifyTable.allow()));
+          List<AuthorizationSecurableObject> authzCatalogObjects =
+              rangerAuthPlugin.translatePrivilege(catalogObject);
+          Assertions.assertEquals(6, authzCatalogObjects.size());
+          Assertions.assertEquals(
+              4,
+              (int)
+                  authzCatalogObjects.stream()
+                      .filter(
+                          authorizationSecurableObject -> {
+                            PathBasedMetadataObject pathBasedMetadataObject =
+                                ((PathBasedMetadataObject) 
authorizationSecurableObject);
+                            return 
pathBasedMetadataObject.path().equals("/test/*/*/")
+                                && pathBasedMetadataObject.recursive();
+                          })
+                      .count());
+
+          Assertions.assertEquals(
+              2,
+              (int)
+                  authzCatalogObjects.stream()
+                      .filter(
+                          authorizationSecurableObject -> {
+                            PathBasedMetadataObject pathBasedMetadataObject =
+                                ((PathBasedMetadataObject) 
authorizationSecurableObject);
+                            return 
pathBasedMetadataObject.path().equals("/test/*/")
+                                && !pathBasedMetadataObject.recursive();
+                          })
+                      .count());
 
-          SecurableObject filesetInSchema =
+          SecurableObject schemaObject =
               SecurableObjects.parse(
                   "catalog1.schema1",
                   MetadataObject.Type.SCHEMA,
                   Lists.newArrayList(
                       Privileges.CreateFileset.allow(),
                       Privileges.ReadFileset.allow(),
-                      Privileges.WriteFileset.allow()));
-          List<AuthorizationSecurableObject> filesetInSchema1 =
-              rangerAuthPlugin.translatePrivilege(filesetInSchema);
-          Assertions.assertEquals(0, filesetInSchema1.size());
+                      Privileges.WriteFileset.allow(),
+                      Privileges.CreateTable.allow(),
+                      Privileges.SelectTable.allow(),
+                      Privileges.ModifyTable.allow()));
+          List<AuthorizationSecurableObject> authzSchemaObjects =
+              rangerAuthPlugin.translatePrivilege(schemaObject);
+          Assertions.assertEquals(6, authzSchemaObjects.size());
+          Assertions.assertEquals(
+              4,
+              (int)
+                  authzSchemaObjects.stream()
+                      .filter(
+                          authorizationSecurableObject -> {
+                            PathBasedMetadataObject pathBasedMetadataObject =
+                                ((PathBasedMetadataObject) 
authorizationSecurableObject);
+                            return 
pathBasedMetadataObject.path().equals("/test/*/")
+                                && pathBasedMetadataObject.recursive();
+                          })
+                      .count());
+
+          Assertions.assertEquals(
+              2,
+              (int)
+                  authzSchemaObjects.stream()
+                      .filter(
+                          authorizationSecurableObject -> {
+                            PathBasedMetadataObject pathBasedMetadataObject =
+                                ((PathBasedMetadataObject) 
authorizationSecurableObject);
+                            return 
pathBasedMetadataObject.path().equals("/test")
+                                && !pathBasedMetadataObject.recursive();
+                          })
+                      .count());
 
-          SecurableObject filesetInFileset =
+          SecurableObject filesetObject =
               SecurableObjects.parse(
                   "catalog1.schema1.fileset1",
                   MetadataObject.Type.FILESET,
                   Lists.newArrayList(
-                      Privileges.CreateFileset.allow(),
-                      Privileges.ReadFileset.allow(),
-                      Privileges.WriteFileset.allow()));
-          List<AuthorizationSecurableObject> filesetInFileset1 =
-              rangerAuthPlugin.translatePrivilege(filesetInFileset);
-          Assertions.assertEquals(2, filesetInFileset1.size());
+                      Privileges.ReadFileset.allow(), 
Privileges.WriteFileset.allow()));
+          List<AuthorizationSecurableObject> filesetObjects =
+              rangerAuthPlugin.translatePrivilege(filesetObject);
+          Assertions.assertEquals(2, filesetObjects.size());
 
-          filesetInFileset1.forEach(
+          filesetObjects.forEach(
               securableObject -> {
                 PathBasedSecurableObject pathBasedSecurableObject =
                     (PathBasedSecurableObject) securableObject;
                 Assertions.assertEquals(
                     PathBasedMetadataObject.FILESET_PATH, 
pathBasedSecurableObject.type());
                 Assertions.assertEquals("/test", 
pathBasedSecurableObject.path());
-                Assertions.assertEquals(2, 
pathBasedSecurableObject.privileges().size());
+              });
+
+          SecurableObject tableObject =
+              SecurableObjects.parse(
+                  "catalog1.schema1.table1",
+                  MetadataObject.Type.TABLE,
+                  Lists.newArrayList(
+                      Privileges.SelectTable.allow(), 
Privileges.ModifyTable.allow()));
+          List<AuthorizationSecurableObject> authzTableObjects =
+              rangerAuthPlugin.translatePrivilege(tableObject);
+          Assertions.assertEquals(2, authzTableObjects.size());
+
+          authzTableObjects.forEach(
+              securableObject -> {
+                PathBasedSecurableObject pathBasedSecurableObject =
+                    (PathBasedSecurableObject) securableObject;
+                Assertions.assertEquals(
+                    PathBasedMetadataObject.TABLE_PATH, 
pathBasedSecurableObject.type());
+                Assertions.assertEquals("/test", 
pathBasedSecurableObject.path());
               });
         });
   }
diff --git 
a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerHiveIT.java
 
b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerHiveIT.java
index 871d4c538b..8857d4e507 100644
--- 
a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerHiveIT.java
+++ 
b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerHiveIT.java
@@ -49,7 +49,7 @@ import org.apache.gravitino.authorization.Role;
 import org.apache.gravitino.authorization.RoleChange;
 import org.apache.gravitino.authorization.SecurableObject;
 import org.apache.gravitino.authorization.SecurableObjects;
-import org.apache.gravitino.authorization.ranger.RangerAuthorizationPlugin;
+import 
org.apache.gravitino.authorization.ranger.RangerAuthorizationHadoopSQLPlugin;
 import org.apache.gravitino.authorization.ranger.RangerClientExtension;
 import org.apache.gravitino.authorization.ranger.RangerHadoopSQLMetadataObject;
 import 
org.apache.gravitino.authorization.ranger.RangerHadoopSQLSecurableObject;
@@ -81,7 +81,7 @@ import org.slf4j.LoggerFactory;
 public class RangerHiveIT {
   private static final Logger LOG = 
LoggerFactory.getLogger(RangerHiveIT.class);
 
-  private static RangerAuthorizationPlugin rangerAuthHivePlugin;
+  private static RangerAuthorizationHadoopSQLPlugin rangerAuthHivePlugin;
   private static RangerHelper rangerHelper;
   private final AuditInfo auditInfo =
       
AuditInfo.builder().withCreator("test").withCreateTime(Instant.now()).build();
@@ -390,7 +390,6 @@ public class RangerHiveIT {
     AuthorizationSecurableObject rangerSecurableObject =
         rangerAuthHivePlugin.generateAuthorizationSecurableObject(
             ImmutableList.of(String.format("%s3", dbName), "tab1"),
-            "",
             RangerHadoopSQLMetadataObject.Type.TABLE,
             ImmutableSet.of(
                 new RangerPrivileges.RangerHivePrivilegeImpl(
diff --git 
a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerITEnv.java
 
b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerITEnv.java
index 0d00733437..87f579dc44 100644
--- 
a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerITEnv.java
+++ 
b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerITEnv.java
@@ -84,8 +84,8 @@ public class RangerITEnv {
   public static final String SEARCH_FILTER_COLUMN = 
SearchFilter.RESOURCE_PREFIX + RESOURCE_COLUMN;
   // Search filter prefix file path constants
   public static final String SEARCH_FILTER_PATH = SearchFilter.RESOURCE_PREFIX 
+ RESOURCE_PATH;
-  public static RangerAuthorizationPlugin rangerAuthHivePlugin;
-  public static RangerAuthorizationPlugin rangerAuthHDFSPlugin;
+  public static RangerAuthorizationHadoopSQLPlugin rangerAuthHivePlugin;
+  public static RangerAuthorizationHDFSPlugin rangerAuthHDFSPlugin;
   protected static RangerHelper rangerHelper;
   protected static RangerHelper rangerHDFSHelper;
   public static String RANGER_ADMIN_URL = null;


Reply via email to