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

jshao 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 aa988e158 [#4698] feat(auth-ranger): Extended Ranger authorization by 
rules (#4744)
aa988e158 is described below

commit aa988e158f196e8574017e84c9660f09d8c7d626
Author: Xun <[email protected]>
AuthorDate: Thu Sep 19 11:08:00 2024 +0800

    [#4698] feat(auth-ranger): Extended Ranger authorization by rules (#4744)
    
    ### What changes were proposed in this pull request?
    
    1. Added interface `RangerPrivilegesMappingProvider`, we can use it to
    map Gravitino privileges to the Ranger privileges.
    2. Added abstract class `RangerAuthorizationPlugin`, we can use it to
    extend another Ranger authorization plugin.
    
    ### Why are the changes needed?
    
    Fix: #4698
    
    ### Does this PR introduce _any_ user-facing change?
    
    NA
    
    ### How was this patch tested?
    
    CI Passed.
---
 .../authorization-ranger/build.gradle.kts          |   6 +-
 .../authorization/ranger/RangerAuthorization.java  |   7 +-
 .../ranger/RangerAuthorizationHivePlugin.java      |  75 +++++++++
 .../ranger/RangerAuthorizationPlugin.java          |  38 ++---
 ...lientExtend.java => RangerClientExtension.java} |   6 +-
 .../authorization/ranger/RangerHelper.java         | 167 ++++++++-------------
 .../authorization/ranger/RangerPrivilege.java      |  81 ++++++++++
 .../authorization/ranger/RangerPrivileges.java     |  42 ++++++
 ...n.java => RangerPrivilegesMappingProvider.java} |  28 ++--
 .../ranger/reference/RangerDefines.java            |  77 +++-------
 .../ranger/integration/test/RangerHiveE2EIT.java   |   4 +-
 .../ranger/integration/test/RangerHiveIT.java      | 106 ++++---------
 .../ranger/integration/test/RangerITEnv.java       |  69 ++++++---
 docs/security/authorization-pushdown.md            |   6 +-
 integration-test-common/build.gradle.kts           |   1 +
 .../test/container/RangerContainer.java            |   6 +-
 16 files changed, 410 insertions(+), 309 deletions(-)

diff --git a/authorizations/authorization-ranger/build.gradle.kts 
b/authorizations/authorization-ranger/build.gradle.kts
index efc20e6c8..47ec7eba5 100644
--- a/authorizations/authorization-ranger/build.gradle.kts
+++ b/authorizations/authorization-ranger/build.gradle.kts
@@ -96,7 +96,7 @@ tasks {
   }
 
   val copyAuthorizationLibs by registering(Copy::class) {
-    dependsOn("jar", "runtimeJars")
+    dependsOn("jar", runtimeJars)
     from("build/libs") {
       exclude("guava-*.jar")
       exclude("log4j-*.jar")
@@ -108,6 +108,10 @@ tasks {
   register("copyLibAndConfig", Copy::class) {
     dependsOn(copyAuthorizationLibs)
   }
+
+  jar {
+    dependsOn(runtimeJars)
+  }
 }
 
 tasks.test {
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorization.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorization.java
index 8a3db8efa..3fb74f288 100644
--- 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorization.java
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorization.java
@@ -31,6 +31,11 @@ public class RangerAuthorization extends 
BaseAuthorization<RangerAuthorization>
 
   @Override
   protected AuthorizationPlugin newPlugin(String catalogProvider, Map<String, 
String> config) {
-    return new RangerAuthorizationPlugin(catalogProvider, config);
+    switch (catalogProvider) {
+      case "hive":
+        return RangerAuthorizationHivePlugin.getInstance(config);
+      default:
+        throw new IllegalArgumentException("Unknown catalog provider: " + 
catalogProvider);
+    }
   }
 }
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHivePlugin.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHivePlugin.java
new file mode 100644
index 000000000..a9b08c866
--- /dev/null
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHivePlugin.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.authorization.ranger;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.apache.gravitino.authorization.Privilege;
+import 
org.apache.gravitino.authorization.ranger.RangerPrivilege.RangerHivePrivilege;
+import 
org.apache.gravitino.authorization.ranger.reference.RangerDefines.PolicyResource;
+
+public class RangerAuthorizationHivePlugin extends RangerAuthorizationPlugin {
+  private static volatile RangerAuthorizationHivePlugin instance = null;
+
+  private RangerAuthorizationHivePlugin(Map<String, String> config) {
+    super(config);
+  }
+
+  public static synchronized RangerAuthorizationHivePlugin 
getInstance(Map<String, String> config) {
+    if (instance == null) {
+      synchronized (RangerAuthorizationHivePlugin.class) {
+        if (instance == null) {
+          instance = new RangerAuthorizationHivePlugin(config);
+        }
+      }
+    }
+    return instance;
+  }
+
+  /** Set the default mapping Gravitino privilege name to the Ranger rule */
+  public Map<Privilege.Name, Set<RangerPrivilege>> privilegesMappingRule() {
+    return ImmutableMap.of(
+        Privilege.Name.CREATE_SCHEMA,
+        ImmutableSet.of(RangerHivePrivilege.CREATE),
+        Privilege.Name.CREATE_TABLE,
+        ImmutableSet.of(RangerHivePrivilege.CREATE),
+        Privilege.Name.MODIFY_TABLE,
+        ImmutableSet.of(
+            RangerHivePrivilege.UPDATE, RangerHivePrivilege.ALTER, 
RangerHivePrivilege.WRITE),
+        Privilege.Name.SELECT_TABLE,
+        ImmutableSet.of(RangerHivePrivilege.READ, RangerHivePrivilege.SELECT));
+  }
+
+  /** Set the default owner rule. */
+  public Set<RangerPrivilege> ownerMappingRule() {
+    return ImmutableSet.of(RangerHivePrivilege.ALL);
+  }
+
+  /** Set Ranger policy resource rule. */
+  public List<String> policyResourceDefinesRule() {
+    return ImmutableList.of(
+        PolicyResource.DATABASE.getName(),
+        PolicyResource.TABLE.getName(),
+        PolicyResource.COLUMN.getName());
+  }
+}
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 75692e987..3b503a3f9 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
@@ -20,7 +20,6 @@ package org.apache.gravitino.authorization.ranger;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
 import java.io.IOException;
 import java.time.Instant;
 import java.util.Collections;
@@ -63,18 +62,16 @@ import org.slf4j.LoggerFactory;
  * 4. The Ranger policy also supports multiple users and groups, But we only 
use a user or group to
  * implement Gravitino Owner concept. <br>
  */
-public class RangerAuthorizationPlugin implements AuthorizationPlugin {
+public abstract class RangerAuthorizationPlugin
+    implements AuthorizationPlugin, RangerPrivilegesMappingProvider {
   private static final Logger LOG = 
LoggerFactory.getLogger(RangerAuthorizationPlugin.class);
 
-  protected String catalogProvider;
-  protected String rangerServiceName;
-  protected RangerClientExtend rangerClient;
-  private RangerHelper rangerHelper;
+  protected final String rangerServiceName;
+  protected final RangerClientExtension rangerClient;
+  private final RangerHelper rangerHelper;
   @VisibleForTesting public final String rangerAdminName;
 
-  public RangerAuthorizationPlugin(String catalogProvider, Map<String, String> 
config) {
-    super();
-    this.catalogProvider = catalogProvider;
+  protected RangerAuthorizationPlugin(Map<String, String> config) {
     String rangerUrl = 
config.get(AuthorizationPropertiesMeta.RANGER_ADMIN_URL);
     String authType = config.get(AuthorizationPropertiesMeta.RANGER_AUTH_TYPE);
     rangerAdminName = config.get(AuthorizationPropertiesMeta.RANGER_USERNAME);
@@ -86,23 +83,26 @@ public class RangerAuthorizationPlugin implements 
AuthorizationPlugin {
     RangerHelper.check(rangerAdminName != null, "Ranger username is required");
     RangerHelper.check(password != null, "Ranger password is required");
     RangerHelper.check(rangerServiceName != null, "Ranger service name is 
required");
-    rangerClient = new RangerClientExtend(rangerUrl, authType, 
rangerAdminName, password);
-    rangerHelper = new RangerHelper(this, catalogProvider);
+    rangerClient = new RangerClientExtension(rangerUrl, authType, 
rangerAdminName, password);
+
+    rangerHelper =
+        new RangerHelper(
+            rangerClient,
+            rangerAdminName,
+            rangerServiceName,
+            privilegesMappingRule(),
+            ownerMappingRule(),
+            policyResourceDefinesRule());
   }
 
   /**
-   * Translate the privilege name to the corresponding privilege name in the 
underlying permission
+   * Translate the privilege name to the corresponding privilege name in the 
Ranger
    *
    * @param name The privilege name to translate
-   * @return The corresponding privilege name in the underlying permission 
system
+   * @return The corresponding Ranger privilege name in the underlying 
permission system
    */
   public Set<String> translatePrivilege(Privilege.Name name) {
-    return rangerHelper.privilegesMapping.get(name);
-  }
-
-  @VisibleForTesting
-  public List<String> getOwnerPrivileges() {
-    return Lists.newArrayList(rangerHelper.ownerPrivileges);
+    return rangerHelper.translatePrivilege(name);
   }
 
   /**
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerClientExtend.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerClientExtension.java
similarity index 97%
rename from 
authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerClientExtend.java
rename to 
authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerClientExtension.java
index 8cc23a66c..fd822559d 100644
--- 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerClientExtend.java
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerClientExtension.java
@@ -40,8 +40,8 @@ import org.slf4j.LoggerFactory;
  * The class extends the RangerClient class and provides additional methods to 
create, search and
  * delete users and groups
  */
-public class RangerClientExtend extends RangerClient {
-  private static final Logger LOG = 
LoggerFactory.getLogger(RangerClientExtend.class);
+public class RangerClientExtension extends RangerClient {
+  private static final Logger LOG = 
LoggerFactory.getLogger(RangerClientExtension.class);
   private static final String URI_USER_BASE = "/service/xusers/users";
   private static final String URI_USER_BY_ID = URI_USER_BASE + "/%d";
   private static final String URI_GROUP_BASE = "/service/xusers/groups";
@@ -75,7 +75,7 @@ public class RangerClientExtend extends RangerClient {
   // private void callAPI(API api, Map<String, String> params) throws 
RangerServiceException
   private Method callAPIMethodNonResponse;
 
-  public RangerClientExtend(String hostName, String authType, String username, 
String password) {
+  public RangerClientExtension(String hostName, String authType, String 
username, String password) {
     super(hostName, authType, username, password, null);
 
     // initialize callAPI method
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerHelper.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerHelper.java
index aad1ebe76..e34fe5685 100644
--- 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerHelper.java
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerHelper.java
@@ -18,13 +18,10 @@
  */
 package org.apache.gravitino.authorization.ranger;
 
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.google.errorprone.annotations.FormatMethod;
 import com.google.errorprone.annotations.FormatString;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -38,7 +35,6 @@ import org.apache.gravitino.authorization.Owner;
 import org.apache.gravitino.authorization.Privilege;
 import org.apache.gravitino.authorization.SecurableObject;
 import org.apache.gravitino.authorization.SecurableObjects;
-import org.apache.gravitino.authorization.ranger.reference.RangerDefines;
 import org.apache.gravitino.exceptions.AuthorizationPluginException;
 import org.apache.ranger.RangerServiceException;
 import org.apache.ranger.plugin.model.RangerPolicy;
@@ -56,83 +52,43 @@ public class RangerHelper {
   private static final Logger LOG = 
LoggerFactory.getLogger(RangerHelper.class);
 
   public static final String MANAGED_BY_GRAVITINO = "MANAGED_BY_GRAVITINO";
-  RangerAuthorizationPlugin rangerAuthorizationPlugin;
 
   /** Mapping Gravitino privilege name to the underlying authorization system 
privileges. */
-  protected Map<Privilege.Name, Set<String>> privilegesMapping = null;
+  private final Map<Privilege.Name, Set<RangerPrivilege>> privilegesMapping;
   /** The owner privileges, the owner can do anything on the metadata object */
-  protected Set<String> ownerPrivileges = null;
+  private final Set<RangerPrivilege> ownerPrivileges;
+  /** The policy search keys */
+  private final List<String> policyResourceDefines;
+
+  private final RangerClientExtension rangerClient;
+  private final String rangerAdminName;
+  private final String rangerServiceName;
+
+  public RangerHelper(
+      RangerClientExtension rangerClient,
+      String rangerAdminName,
+      String rangerServiceName,
+      Map<Privilege.Name, Set<RangerPrivilege>> privilegesMapping,
+      Set<RangerPrivilege> ownerPrivileges,
+      List<String> resourceDefines) {
+    this.rangerClient = rangerClient;
+    this.rangerAdminName = rangerAdminName;
+    this.rangerServiceName = rangerServiceName;
+    this.privilegesMapping = privilegesMapping;
+    this.ownerPrivileges = ownerPrivileges;
+    this.policyResourceDefines = resourceDefines;
+  }
 
   /**
-   * Because Ranger doesn't support the precise search, Ranger will return the 
policy meets the
-   * wildcard(*,?) conditions, If you use `db.table` condition to search 
policy, the Ranger will
-   * match `db1.table1`, `db1.table2`, `db*.table*`, So we need to manually 
precisely filter this
-   * research results. <br>
-   * policySearchKeys: The search Ranger policy condition key defines. <br>
-   * policyPreciseFilterKeys: The precise filter Ranger search results key 
defines <br>
+   * Translate the privilege name to the corresponding privilege name in the 
Ranger
+   *
+   * @param name The privilege name to translate
+   * @return The corresponding Ranger privilege name in the underlying 
permission system
    */
-  protected List<String> policySearchKeys = null;
-
-  protected List<String> policyPreciseFilterKeys = null;
-
-  public RangerHelper(RangerAuthorizationPlugin rangerAuthorizationPlugin, 
String catalogProvider) {
-    this.rangerAuthorizationPlugin = rangerAuthorizationPlugin;
-    switch (catalogProvider) {
-      case "hive":
-        initPrivilegesMapping();
-        initOwnerPrivileges();
-        initPolicySearchKeys();
-        initPreciseFilterKeys();
-        break;
-      default:
-        throw new IllegalArgumentException(
-            "Authorization plugin unsupported catalog provider: " + 
catalogProvider);
-    }
-  }
-
-  /** Initial mapping Gravitino privilege name to the underlying authorization 
system privileges. */
-  private void initPrivilegesMapping() {
-    privilegesMapping =
-        ImmutableMap.<Privilege.Name, Set<String>>builder()
-            .put(
-                Privilege.Name.CREATE_SCHEMA,
-                ImmutableSet.of(RangerDefines.ACCESS_TYPE_HIVE_CREATE))
-            .put(
-                Privilege.Name.CREATE_TABLE, 
ImmutableSet.of(RangerDefines.ACCESS_TYPE_HIVE_CREATE))
-            .put(
-                Privilege.Name.MODIFY_TABLE,
-                ImmutableSet.of(
-                    RangerDefines.ACCESS_TYPE_HIVE_UPDATE,
-                    RangerDefines.ACCESS_TYPE_HIVE_ALTER,
-                    RangerDefines.ACCESS_TYPE_HIVE_WRITE))
-            .put(
-                Privilege.Name.SELECT_TABLE,
-                ImmutableSet.of(
-                    RangerDefines.ACCESS_TYPE_HIVE_READ, 
RangerDefines.ACCESS_TYPE_HIVE_SELECT))
-            .build();
-  }
-
-  /** Initial Owner privileges */
-  private void initOwnerPrivileges() {
-    ownerPrivileges = ImmutableSet.of(RangerDefines.ACCESS_TYPE_HIVE_ALL);
-  }
-
-  /** Initial Ranger policy search key defines */
-  private void initPolicySearchKeys() {
-    policySearchKeys =
-        Arrays.asList(
-            RangerDefines.SEARCH_FILTER_DATABASE,
-            RangerDefines.SEARCH_FILTER_TABLE,
-            RangerDefines.SEARCH_FILTER_COLUMN);
-  }
-
-  /** Initial precise filter key defines */
-  private void initPreciseFilterKeys() {
-    policyPreciseFilterKeys =
-        Arrays.asList(
-            RangerDefines.RESOURCE_DATABASE,
-            RangerDefines.RESOURCE_TABLE,
-            RangerDefines.RESOURCE_COLUMN);
+  public Set<String> translatePrivilege(Privilege.Name name) {
+    return privilegesMapping.get(name).stream()
+        .map(RangerPrivilege::getName)
+        .collect(Collectors.toSet());
   }
 
   /**
@@ -176,10 +132,9 @@ public class RangerHelper {
         .forEach(
             gravitinoPrivilege -> {
               // Translate the Gravitino privilege to map Ranger privilege
-              rangerAuthorizationPlugin
-                  .translatePrivilege(gravitinoPrivilege.name())
+              translatePrivilege(gravitinoPrivilege.name())
                   .forEach(
-                      mappedPrivilege -> {
+                      rangerPrivilege -> {
                         // Find the policy item that matches Gravitino 
privilege
                         List<RangerPolicy.RangerPolicyItem> matchPolicyItems =
                             policy.getPolicyItems().stream()
@@ -187,7 +142,7 @@ public class RangerHelper {
                                     policyItem -> {
                                       return policyItem.getAccesses().stream()
                                           .anyMatch(
-                                              access -> 
access.getType().equals(mappedPrivilege));
+                                              access -> 
access.getType().equals(rangerPrivilege));
                                     })
                                 .collect(Collectors.toList());
 
@@ -197,7 +152,7 @@ public class RangerHelper {
                               new RangerPolicy.RangerPolicyItem();
                           RangerPolicy.RangerPolicyItemAccess access =
                               new RangerPolicy.RangerPolicyItemAccess();
-                          access.setType(mappedPrivilege);
+                          access.setType(rangerPrivilege);
                           policyItem.getAccesses().add(access);
                           policyItem.getRoles().add(roleName);
                           if (Privilege.Condition.ALLOW == 
gravitinoPrivilege.condition()) {
@@ -240,10 +195,7 @@ public class RangerHelper {
                         boolean matchPrivilege =
                             securableObject.privileges().stream()
                                 .filter(Objects::nonNull)
-                                .flatMap(
-                                    privilege ->
-                                        rangerAuthorizationPlugin
-                                            
.translatePrivilege(privilege.name()).stream())
+                                .flatMap(privilege -> 
translatePrivilege(privilege.name()).stream())
                                 .filter(Objects::nonNull)
                                 .anyMatch(
                                     privilege -> {
@@ -297,17 +249,16 @@ public class RangerHelper {
 
     Map<String, String> searchFilters = new HashMap<>();
     Map<String, String> preciseFilters = new HashMap<>();
-    searchFilters.put(
-        RangerDefines.SEARCH_FILTER_SERVICE_NAME, 
rangerAuthorizationPlugin.rangerServiceName);
+    searchFilters.put(SearchFilter.SERVICE_NAME, rangerServiceName);
     searchFilters.put(SearchFilter.POLICY_LABELS_PARTIAL, 
MANAGED_BY_GRAVITINO);
     for (int i = 0; i < nsMetadataObj.size(); i++) {
-      searchFilters.put(policySearchKeys.get(i), nsMetadataObj.get(i));
-      preciseFilters.put(policyPreciseFilterKeys.get(i), nsMetadataObj.get(i));
+      searchFilters.put(
+          SearchFilter.RESOURCE_PREFIX + policyResourceDefines.get(i), 
nsMetadataObj.get(i));
+      preciseFilters.put(policyResourceDefines.get(i), nsMetadataObj.get(i));
     }
 
     try {
-      List<RangerPolicy> policies =
-          rangerAuthorizationPlugin.rangerClient.findPolicies(searchFilters);
+      List<RangerPolicy> policies = rangerClient.findPolicies(searchFilters);
 
       if (!policies.isEmpty()) {
         /**
@@ -357,10 +308,7 @@ public class RangerHelper {
 
   protected boolean checkRangerRole(String roleName) throws 
AuthorizationPluginException {
     try {
-      rangerAuthorizationPlugin.rangerClient.getRole(
-          roleName,
-          rangerAuthorizationPlugin.rangerAdminName,
-          rangerAuthorizationPlugin.rangerServiceName);
+      rangerClient.getRole(roleName, rangerAdminName, rangerServiceName);
     } catch (RangerServiceException e) {
       throw new AuthorizationPluginException(e);
     }
@@ -377,7 +325,7 @@ public class RangerHelper {
     GrantRevokeRoleRequest roleRequest = new GrantRevokeRoleRequest();
     roleRequest.setUsers(users);
     roleRequest.setGroups(groups);
-    roleRequest.setGrantor(rangerAuthorizationPlugin.rangerAdminName);
+    roleRequest.setGrantor(rangerAdminName);
     roleRequest.setTargetRoles(Sets.newHashSet(roleName));
     return roleRequest;
   }
@@ -386,11 +334,7 @@ public class RangerHelper {
   protected RangerRole createRangerRoleIfNotExists(String roleName) {
     RangerRole rangerRole = null;
     try {
-      rangerRole =
-          rangerAuthorizationPlugin.rangerClient.getRole(
-              roleName,
-              rangerAuthorizationPlugin.rangerAdminName,
-              rangerAuthorizationPlugin.rangerServiceName);
+      rangerRole = rangerClient.getRole(roleName, rangerAdminName, 
rangerServiceName);
     } catch (RangerServiceException e) {
       // ignore exception, If the role does not exist, then create it.
       LOG.warn("The role({}) does not exist in the Ranger!", roleName);
@@ -398,8 +342,7 @@ public class RangerHelper {
     try {
       if (rangerRole == null) {
         rangerRole = new RangerRole(roleName, 
RangerHelper.MANAGED_BY_GRAVITINO, null, null, null);
-        rangerAuthorizationPlugin.rangerClient.createRole(
-            rangerAuthorizationPlugin.rangerServiceName, rangerRole);
+        rangerClient.createRole(rangerServiceName, rangerRole);
       }
     } catch (RangerServiceException e) {
       throw new RuntimeException(e);
@@ -416,7 +359,11 @@ public class RangerHelper {
                   return policyItem.getAccesses().stream()
                       .allMatch(
                           policyItemAccess -> {
-                            return 
ownerPrivileges.contains(policyItemAccess.getType());
+                            return ownerPrivileges.stream()
+                                .anyMatch(
+                                    ownerPrivilege -> {
+                                      return 
ownerPrivilege.equalsTo(policyItemAccess.getType());
+                                    });
                           });
                 })
             .collect(Collectors.toList());
@@ -453,7 +400,7 @@ public class RangerHelper {
                         return policyItem.getAccesses().stream()
                             .anyMatch(
                                 policyItemAccess -> {
-                                  return 
ownerPrivilege.equals(policyItemAccess.getType());
+                                  return 
ownerPrivilege.equalsTo(policyItemAccess.getType());
                                 });
                       });
             })
@@ -461,7 +408,9 @@ public class RangerHelper {
             // Add lost owner's privilege to the policy
             ownerPrivilege -> {
               RangerPolicy.RangerPolicyItem policyItem = new 
RangerPolicy.RangerPolicyItem();
-              policyItem.getAccesses().add(new 
RangerPolicy.RangerPolicyItemAccess(ownerPrivilege));
+              policyItem
+                  .getAccesses()
+                  .add(new 
RangerPolicy.RangerPolicyItemAccess(ownerPrivilege.getName()));
               if (newOwner != null) {
                 if (newOwner.type() == Owner.Type.USER) {
                   policyItem.getUsers().add(newOwner.name());
@@ -486,7 +435,7 @@ public class RangerHelper {
 
   protected RangerPolicy createPolicyAddResources(MetadataObject 
metadataObject) {
     RangerPolicy policy = new RangerPolicy();
-    policy.setService(rangerAuthorizationPlugin.rangerServiceName);
+    policy.setService(rangerServiceName);
     policy.setName(metadataObject.fullName());
     
policy.setPolicyLabels(Lists.newArrayList(RangerHelper.MANAGED_BY_GRAVITINO));
 
@@ -495,7 +444,7 @@ public class RangerHelper {
     for (int i = 0; i < nsMetadataObject.size(); i++) {
       RangerPolicy.RangerPolicyResource policyResource =
           new RangerPolicy.RangerPolicyResource(nsMetadataObject.get(i));
-      policy.getResources().put(policyPreciseFilterKeys.get(i), 
policyResource);
+      policy.getResources().put(policyResourceDefines.get(i), policyResource);
     }
     return policy;
   }
@@ -507,7 +456,9 @@ public class RangerHelper {
         ownerPrivilege -> {
           // Each owner's privilege will create one RangerPolicyItemAccess in 
the policy
           RangerPolicy.RangerPolicyItem policyItem = new 
RangerPolicy.RangerPolicyItem();
-          policyItem.getAccesses().add(new 
RangerPolicy.RangerPolicyItemAccess(ownerPrivilege));
+          policyItem
+              .getAccesses()
+              .add(new 
RangerPolicy.RangerPolicyItemAccess(ownerPrivilege.getName()));
           if (newOwner != null) {
             if (newOwner.type() == Owner.Type.USER) {
               policyItem.getUsers().add(newOwner.name());
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivilege.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivilege.java
new file mode 100644
index 000000000..0953ac9a5
--- /dev/null
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivilege.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.authorization.ranger;
+
+/** RangerPrivilege interface is used to define the Ranger privileges. */
+public interface RangerPrivilege {
+  String getName();
+
+  boolean equalsTo(String value);
+
+  /** Ranger Hive privileges enumeration. */
+  enum RangerHivePrivilege implements RangerPrivilege {
+    ALL("all"),
+    SELECT("select"),
+    UPDATE("update"),
+    CREATE("create"),
+    DROP("drop"),
+    ALTER("alter"),
+    INDEX("index"),
+    LOCK("lock"),
+    READ("read"),
+    WRITE("write"),
+    REPLADMIN("repladmin"),
+    SERVICEADMIN("serviceadmin");
+
+    private final String name; // Access a type in the Ranger policy item
+
+    RangerHivePrivilege(String name) {
+      this.name = name;
+    }
+
+    @Override
+    public String getName() {
+      return name;
+    }
+
+    @Override
+    public boolean equalsTo(String value) {
+      return name.equalsIgnoreCase(value);
+    }
+  }
+
+  /** Ranger HDFS privileges enumeration. */
+  enum RangerHdfsPrivilege implements RangerPrivilege {
+    READ("read"),
+    WRITE("write"),
+    EXECUTE("execute");
+
+    private final String name; // Access a type in the Ranger policy item
+
+    RangerHdfsPrivilege(String name) {
+      this.name = name;
+    }
+
+    @Override
+    public String getName() {
+      return name;
+    }
+
+    @Override
+    public boolean equalsTo(String value) {
+      return name.equalsIgnoreCase(value);
+    }
+  }
+}
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivileges.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivileges.java
new file mode 100644
index 000000000..1dff01dc8
--- /dev/null
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivileges.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.authorization.ranger;
+
+import com.google.common.collect.Lists;
+import java.util.List;
+
+public class RangerPrivileges {
+  static List<Class<? extends Enum<? extends RangerPrivilege>>> 
allRangerPrivileges =
+      Lists.newArrayList(
+          RangerPrivilege.RangerHivePrivilege.class, 
RangerPrivilege.RangerHdfsPrivilege.class);
+
+  public static RangerPrivilege valueOf(String string) {
+    RangerHelper.check(string != null, "Privilege name string cannot be 
null!");
+
+    String strPrivilege = string.trim().toLowerCase();
+    for (Class<? extends Enum<? extends RangerPrivilege>> enumClass : 
allRangerPrivileges) {
+      for (Enum<? extends RangerPrivilege> privilege : 
enumClass.getEnumConstants()) {
+        if (((RangerPrivilege) privilege).equalsTo(strPrivilege)) {
+          return (RangerPrivilege) privilege;
+        }
+      }
+    }
+    throw new IllegalArgumentException("Unknown privilege string: " + string);
+  }
+}
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorization.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivilegesMappingProvider.java
similarity index 55%
copy from 
authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorization.java
copy to 
authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivilegesMappingProvider.java
index 8a3db8efa..c6a154d22 100644
--- 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorization.java
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivilegesMappingProvider.java
@@ -18,19 +18,23 @@
  */
 package org.apache.gravitino.authorization.ranger;
 
+import java.util.List;
 import java.util.Map;
-import org.apache.gravitino.connector.authorization.AuthorizationPlugin;
-import org.apache.gravitino.connector.authorization.BaseAuthorization;
+import java.util.Set;
+import org.apache.gravitino.authorization.Privilege;
 
-/** Implementation of a Ranger authorization in Gravitino. */
-public class RangerAuthorization extends 
BaseAuthorization<RangerAuthorization> {
-  @Override
-  public String shortName() {
-    return "ranger";
-  }
+/**
+ * Ranger authorization use this provider to mapping Gravitino privilege to 
the Ranger privileges.
+ * We can use this it to support the different Ranger authorization 
components, such as Hive, HDFS,
+ * HBase, etc.
+ */
+public interface RangerPrivilegesMappingProvider {
+  /** Set the mapping Gravitino privilege name to the Ranger privileges rule. 
*/
+  Map<Privilege.Name, Set<RangerPrivilege>> privilegesMappingRule();
+
+  /** Set the owner privileges rule. */
+  Set<RangerPrivilege> ownerMappingRule();
 
-  @Override
-  protected AuthorizationPlugin newPlugin(String catalogProvider, Map<String, 
String> config) {
-    return new RangerAuthorizationPlugin(catalogProvider, config);
-  }
+  /** Set the policy resource defines rule. */
+  List<String> policyResourceDefinesRule();
 }
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/reference/RangerDefines.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/reference/RangerDefines.java
index aa11ca215..b81fc3fdc 100644
--- 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/reference/RangerDefines.java
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/reference/RangerDefines.java
@@ -18,72 +18,35 @@
  */
 package org.apache.gravitino.authorization.ranger.reference;
 
-import org.apache.ranger.plugin.util.SearchFilter;
-
 public class RangerDefines {
-  // In the Ranger 2.4.0
-  // 
apache/ranger/security-admin/src/main/java/org/apache/ranger/service/RangerServiceDefService.java:L43
-  public static final String IMPLICIT_CONDITION_EXPRESSION_NAME = 
"_expression";
-
-  // In the Ranger 2.4.0
-  // 
apache/ranger/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java:L159
-  // Search filter constants
-  public static final String SEARCH_FILTER_SERVICE_NAME = 
SearchFilter.SERVICE_NAME;
-  // Hive resource database name
-  public static final String RESOURCE_DATABASE = "database";
-  // Hive resource table name
-  public static final String RESOURCE_TABLE = "table";
-  // Hive resource column name
-  public static final String RESOURCE_COLUMN = "column";
-  // HDFS resource path name
-  public static final String RESOURCE_PATH = "path";
-  // Search filter prefix database constants
-  public static final String SEARCH_FILTER_DATABASE =
-      SearchFilter.RESOURCE_PREFIX + RESOURCE_DATABASE;
-  // Search filter prefix table constants
-  public static final String SEARCH_FILTER_TABLE = 
SearchFilter.RESOURCE_PREFIX + RESOURCE_TABLE;
-  // Search filter prefix column constants
-  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;
   // Ranger service type HDFS
   public static final String SERVICE_TYPE_HDFS = "hdfs"; // HDFS service type
   // Ranger service type Hive
   public static final String SERVICE_TYPE_HIVE = "hive"; // Hive service type
+
+  // In the Ranger 2.4.0
+  // 
agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
   // {OWNER}: resource owner user variable
   public static final String OWNER_USER = "{OWNER}";
   // {USER}: current user variable
   public static final String CURRENT_USER = "{USER}";
   // public group
   public static final String PUBLIC_GROUP = "public";
-  // Read access type in the HDFS
-  public static final String ACCESS_TYPE_HDFS_READ = "read";
-  // Write access type in the HDFS
-  public static final String ACCESS_TYPE_HDFS_WRITE = "write";
-  // execute access type in the HDFS
-  public static final String ACCESS_TYPE_HDFS_EXECUTE = "execute";
-  // All access type in the Hive
-  public static final String ACCESS_TYPE_HIVE_ALL = "all";
-  // Select access type in the Hive
-  public static final String ACCESS_TYPE_HIVE_SELECT = "select";
-  // update access type in the Hive
-  public static final String ACCESS_TYPE_HIVE_UPDATE = "update";
-  // create access type in the Hive
-  public static final String ACCESS_TYPE_HIVE_CREATE = "create";
-  // drop access type in the Hive
-  public static final String ACCESS_TYPE_HIVE_DROP = "drop";
-  // alter access type in the Hive
-  public static final String ACCESS_TYPE_HIVE_ALTER = "alter";
-  // index access type in the Hive
-  public static final String ACCESS_TYPE_HIVE_INDEX = "index";
-  // lock access type in the Hive
-  public static final String ACCESS_TYPE_HIVE_LOCK = "lock";
-  // read access type in the Hive
-  public static final String ACCESS_TYPE_HIVE_READ = "read";
-  // write access type in the Hive
-  public static final String ACCESS_TYPE_HIVE_WRITE = "write";
-  // repladmin access type in the Hive
-  public static final String ACCESS_TYPE_HIVE_REPLADMIN = "repladmin";
-  // serviceadmin access type in the Hive
-  public static final String ACCESS_TYPE_HIVE_SERVICEADMIN = "serviceadmin";
+
+  public enum PolicyResource {
+    // In the Ranger 2.4.0 
agents-common/src/main/resources/service-defs/ranger-servicedef-hive.json
+    DATABASE("database"),
+    TABLE("table"),
+    COLUMN("column");
+
+    private final String name;
+
+    PolicyResource(String name) {
+      this.name = name;
+    }
+
+    public String getName() {
+      return name;
+    }
+  }
 }
diff --git 
a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerHiveE2EIT.java
 
b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerHiveE2EIT.java
index 89ecbc849..1c57a0001 100644
--- 
a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerHiveE2EIT.java
+++ 
b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerHiveE2EIT.java
@@ -42,6 +42,7 @@ import org.apache.gravitino.authorization.Privileges;
 import org.apache.gravitino.authorization.Role;
 import org.apache.gravitino.authorization.SecurableObject;
 import org.apache.gravitino.authorization.SecurableObjects;
+import org.apache.gravitino.authorization.ranger.RangerAuthorizationHivePlugin;
 import org.apache.gravitino.authorization.ranger.RangerAuthorizationPlugin;
 import org.apache.gravitino.catalog.hive.HiveConstants;
 import org.apache.gravitino.client.GravitinoMetalake;
@@ -149,8 +150,7 @@ public class RangerHiveE2EIT extends AbstractIT {
 
   private static void createCatalogAndRangerAuthPlugin() {
     rangerAuthPlugin =
-        new RangerAuthorizationPlugin(
-            "hive",
+        RangerAuthorizationHivePlugin.getInstance(
             ImmutableMap.of(
                 AuthorizationPropertiesMeta.RANGER_ADMIN_URL,
                 String.format(
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 79f66ef28..7f5579c47 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
@@ -19,7 +19,9 @@
 package org.apache.gravitino.authorization.ranger.integration.test;
 
 import static org.apache.gravitino.authorization.SecurableObjects.DOT_SPLITTER;
+import static 
org.apache.gravitino.authorization.ranger.integration.test.RangerITEnv.RESOURCE_DATABASE;
 import static 
org.apache.gravitino.authorization.ranger.integration.test.RangerITEnv.currentFunName;
+import static 
org.apache.gravitino.authorization.ranger.integration.test.RangerITEnv.rangerClient;
 import static 
org.apache.gravitino.authorization.ranger.integration.test.RangerITEnv.verifyRoleInRanger;
 
 import com.google.common.collect.ImmutableMap;
@@ -44,8 +46,11 @@ 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.RangerAuthorizationHivePlugin;
 import org.apache.gravitino.authorization.ranger.RangerAuthorizationPlugin;
 import org.apache.gravitino.authorization.ranger.RangerHelper;
+import org.apache.gravitino.authorization.ranger.RangerPrivilege;
+import org.apache.gravitino.authorization.ranger.RangerPrivileges;
 import org.apache.gravitino.authorization.ranger.reference.RangerDefines;
 import org.apache.gravitino.connector.AuthorizationPropertiesMeta;
 import org.apache.gravitino.integration.test.container.ContainerSuite;
@@ -101,8 +106,7 @@ public class RangerHiveIT {
                 adminUser)));
 
     rangerAuthPlugin =
-        new RangerAuthorizationPlugin(
-            "hive",
+        RangerAuthorizationHivePlugin.getInstance(
             ImmutableMap.of(
                 AuthorizationPropertiesMeta.RANGER_ADMIN_URL,
                 String.format(
@@ -117,7 +121,14 @@ public class RangerHiveIT {
                 RangerContainer.rangerPassword,
                 AuthorizationPropertiesMeta.RANGER_SERVICE_NAME,
                 RangerITEnv.RANGER_HIVE_REPO_NAME));
-    rangerPolicyHelper = new RangerHelper(rangerAuthPlugin, "hive");
+    rangerPolicyHelper =
+        new RangerHelper(
+            rangerClient,
+            RangerContainer.rangerUserName,
+            RangerITEnv.RANGER_HIVE_REPO_NAME,
+            rangerAuthPlugin.privilegesMappingRule(),
+            rangerAuthPlugin.ownerMappingRule(),
+            rangerAuthPlugin.policyResourceDefinesRule());
 
     // Create hive connection
     String url =
@@ -280,8 +291,8 @@ public class RangerHiveIT {
           new RangerPolicy.RangerPolicyResource(metaObjects.get(i));
       policyResourceMap.put(
           i == 0
-              ? RangerDefines.RESOURCE_DATABASE
-              : i == 1 ? RangerDefines.RESOURCE_TABLE : 
RangerDefines.RESOURCE_COLUMN,
+              ? RangerITEnv.RESOURCE_DATABASE
+              : i == 1 ? RangerITEnv.RESOURCE_TABLE : 
RangerITEnv.RESOURCE_COLUMN,
           policyResource);
     }
 
@@ -289,7 +300,8 @@ public class RangerHiveIT {
     policyItem.setGroups(Arrays.asList(RangerDefines.PUBLIC_GROUP));
     policyItem.setAccesses(
         Arrays.asList(
-            new 
RangerPolicy.RangerPolicyItemAccess(RangerDefines.ACCESS_TYPE_HIVE_SELECT)));
+            new RangerPolicy.RangerPolicyItemAccess(
+                RangerPrivilege.RangerHivePrivilege.SELECT.toString())));
     RangerITEnv.updateOrCreateRangerPolicy(
         RangerDefines.SERVICE_TYPE_HIVE,
         RangerITEnv.RANGER_HIVE_REPO_NAME,
@@ -1132,8 +1144,8 @@ public class RangerHiveIT {
               .getResources()
               .get(
                   i == 0
-                      ? RangerDefines.RESOURCE_DATABASE
-                      : i == 1 ? RangerDefines.RESOURCE_TABLE : 
RangerDefines.RESOURCE_COLUMN)
+                      ? RangerITEnv.RESOURCE_DATABASE
+                      : i == 1 ? RangerITEnv.RESOURCE_TABLE : 
RangerITEnv.RESOURCE_COLUMN)
               .getValues()
               .get(0));
     }
@@ -1146,7 +1158,9 @@ public class RangerHiveIT {
               return policyItem.getAccesses().stream()
                   .anyMatch(
                       access -> {
-                        return 
rangerAuthPlugin.getOwnerPrivileges().contains(access.getType());
+                        return rangerAuthPlugin
+                            .ownerMappingRule()
+                            
.contains(RangerPrivileges.valueOf(access.getType()));
                       });
             })
         .anyMatch(
@@ -1195,69 +1209,6 @@ public class RangerHiveIT {
     verifyOwnerInRanger(metadataObject, includeUsers, null, null, null);
   }
 
-  /** Currently we only test Ranger Hive, So wo Allow anyone to visit HDFS */
-  static void allowAnyoneAccessHDFS() {
-    String policyName = currentFunName();
-    try {
-      if (null != 
RangerITEnv.rangerClient.getPolicy(RangerDefines.SERVICE_TYPE_HDFS, 
policyName)) {
-        return;
-      }
-    } catch (RangerServiceException e) {
-      // If the policy doesn't exist, we will create it
-    }
-
-    Map<String, RangerPolicy.RangerPolicyResource> policyResourceMap =
-        ImmutableMap.of(RangerDefines.RESOURCE_PATH, new 
RangerPolicy.RangerPolicyResource("/*"));
-    RangerPolicy.RangerPolicyItem policyItem = new 
RangerPolicy.RangerPolicyItem();
-    policyItem.setUsers(Arrays.asList(RangerDefines.CURRENT_USER));
-    policyItem.setAccesses(
-        Arrays.asList(
-            new 
RangerPolicy.RangerPolicyItemAccess(RangerDefines.ACCESS_TYPE_HDFS_READ),
-            new 
RangerPolicy.RangerPolicyItemAccess(RangerDefines.ACCESS_TYPE_HDFS_WRITE),
-            new 
RangerPolicy.RangerPolicyItemAccess(RangerDefines.ACCESS_TYPE_HDFS_EXECUTE)));
-    RangerITEnv.updateOrCreateRangerPolicy(
-        RangerDefines.SERVICE_TYPE_HDFS,
-        RangerITEnv.RANGER_HDFS_REPO_NAME,
-        policyName,
-        policyResourceMap,
-        Collections.singletonList(policyItem));
-  }
-
-  /**
-   * Hive must have this policy Allow anyone can access information schema to 
show `database`,
-   * `tables` and `columns`
-   */
-  static void allowAnyoneAccessInformationSchema() {
-    String policyName = currentFunName();
-    try {
-      if (null != 
RangerITEnv.rangerClient.getPolicy(RangerDefines.SERVICE_TYPE_HIVE, 
policyName)) {
-        return;
-      }
-    } catch (RangerServiceException e) {
-      // If the policy doesn't exist, we will create it
-    }
-
-    Map<String, RangerPolicy.RangerPolicyResource> policyResourceMap =
-        ImmutableMap.of(
-            RangerDefines.RESOURCE_DATABASE,
-            new RangerPolicy.RangerPolicyResource("information_schema"),
-            RangerDefines.RESOURCE_TABLE,
-            new RangerPolicy.RangerPolicyResource("*"),
-            RangerDefines.RESOURCE_COLUMN,
-            new RangerPolicy.RangerPolicyResource("*"));
-    RangerPolicy.RangerPolicyItem policyItem = new 
RangerPolicy.RangerPolicyItem();
-    policyItem.setGroups(Arrays.asList(RangerDefines.PUBLIC_GROUP));
-    policyItem.setAccesses(
-        Arrays.asList(
-            new 
RangerPolicy.RangerPolicyItemAccess(RangerDefines.ACCESS_TYPE_HIVE_SELECT)));
-    RangerITEnv.updateOrCreateRangerPolicy(
-        RangerDefines.SERVICE_TYPE_HIVE,
-        RangerITEnv.RANGER_HIVE_REPO_NAME,
-        policyName,
-        policyResourceMap,
-        Collections.singletonList(policyItem));
-  }
-
   @Test
   public void testCreateDatabase() throws Exception {
     String dbName = currentFunName().toLowerCase(); // Hive database name is 
case-insensitive
@@ -1265,12 +1216,13 @@ public class RangerHiveIT {
     // Only allow admin user to operation database `db1`
     // Other users can't see the database `db1`
     Map<String, RangerPolicy.RangerPolicyResource> policyResourceMap =
-        ImmutableMap.of(
-            RangerDefines.RESOURCE_DATABASE, new 
RangerPolicy.RangerPolicyResource(dbName));
+        ImmutableMap.of(RESOURCE_DATABASE, new 
RangerPolicy.RangerPolicyResource(dbName));
     RangerPolicy.RangerPolicyItem policyItem = new 
RangerPolicy.RangerPolicyItem();
     policyItem.setUsers(Arrays.asList(adminUser));
     policyItem.setAccesses(
-        Arrays.asList(new 
RangerPolicy.RangerPolicyItemAccess(RangerDefines.ACCESS_TYPE_HIVE_ALL)));
+        Arrays.asList(
+            new RangerPolicy.RangerPolicyItemAccess(
+                RangerPrivilege.RangerHivePrivilege.ALL.toString())));
     RangerITEnv.updateOrCreateRangerPolicy(
         RangerDefines.SERVICE_TYPE_HIVE,
         RangerITEnv.RANGER_HIVE_REPO_NAME,
@@ -1300,7 +1252,9 @@ public class RangerHiveIT {
     // Allow anonymous user to see the database `db1`
     policyItem.setUsers(Arrays.asList(adminUser, anonymousUser));
     policyItem.setAccesses(
-        Arrays.asList(new 
RangerPolicy.RangerPolicyItemAccess(RangerDefines.ACCESS_TYPE_HIVE_ALL)));
+        Arrays.asList(
+            new RangerPolicy.RangerPolicyItemAccess(
+                RangerPrivilege.RangerHivePrivilege.ALL.toString())));
     RangerITEnv.updateOrCreateRangerPolicy(
         RangerDefines.SERVICE_TYPE_HIVE,
         RangerITEnv.RANGER_HIVE_REPO_NAME,
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 2808a2b79..9a9d713f7 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
@@ -29,12 +29,13 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.gravitino.authorization.Role;
 import org.apache.gravitino.authorization.ranger.RangerAuthorizationPlugin;
+import org.apache.gravitino.authorization.ranger.RangerClientExtension;
 import org.apache.gravitino.authorization.ranger.RangerHelper;
+import org.apache.gravitino.authorization.ranger.RangerPrivilege;
 import org.apache.gravitino.authorization.ranger.reference.RangerDefines;
 import org.apache.gravitino.integration.test.container.ContainerSuite;
 import org.apache.gravitino.integration.test.container.HiveContainer;
 import org.apache.gravitino.integration.test.container.TrinoContainer;
-import org.apache.ranger.RangerClient;
 import org.apache.ranger.RangerServiceException;
 import org.apache.ranger.plugin.model.RangerPolicy;
 import org.apache.ranger.plugin.model.RangerRole;
@@ -53,10 +54,27 @@ public class RangerITEnv {
   private static final String RANGER_HIVE_TYPE = "hive";
   protected static final String RANGER_HDFS_REPO_NAME = "hdfsDev";
   private static final String RANGER_HDFS_TYPE = "hdfs";
-  protected static RangerClient rangerClient;
+  protected static RangerClientExtension rangerClient;
   private static volatile boolean initRangerService = false;
   private static final ContainerSuite containerSuite = 
ContainerSuite.getInstance();
 
+  // Hive resource database name
+  public static final String RESOURCE_DATABASE = "database";
+  // Hive resource table name
+  public static final String RESOURCE_TABLE = "table";
+  // Hive resource column name
+  public static final String RESOURCE_COLUMN = "column";
+  // HDFS resource path name
+  public static final String RESOURCE_PATH = "path";
+  public static final String SEARCH_FILTER_DATABASE =
+      SearchFilter.RESOURCE_PREFIX + RESOURCE_DATABASE;
+  // Search filter prefix table constants
+  public static final String SEARCH_FILTER_TABLE = 
SearchFilter.RESOURCE_PREFIX + RESOURCE_TABLE;
+  // Search filter prefix column constants
+  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 void setup() {
     containerSuite.startRangerContainer();
     rangerClient = containerSuite.getRangerContainer().rangerClient;
@@ -101,14 +119,17 @@ public class RangerITEnv {
     }
 
     Map<String, RangerPolicy.RangerPolicyResource> policyResourceMap =
-        ImmutableMap.of(RangerDefines.RESOURCE_PATH, new 
RangerPolicy.RangerPolicyResource("/*"));
+        ImmutableMap.of("path", new RangerPolicy.RangerPolicyResource("/*"));
     RangerPolicy.RangerPolicyItem policyItem = new 
RangerPolicy.RangerPolicyItem();
     policyItem.setUsers(Arrays.asList(RangerDefines.CURRENT_USER));
     policyItem.setAccesses(
         Arrays.asList(
-            new 
RangerPolicy.RangerPolicyItemAccess(RangerDefines.ACCESS_TYPE_HDFS_READ),
-            new 
RangerPolicy.RangerPolicyItemAccess(RangerDefines.ACCESS_TYPE_HDFS_WRITE),
-            new 
RangerPolicy.RangerPolicyItemAccess(RangerDefines.ACCESS_TYPE_HDFS_EXECUTE)));
+            new RangerPolicy.RangerPolicyItemAccess(
+                RangerPrivilege.RangerHdfsPrivilege.READ.toString()),
+            new RangerPolicy.RangerPolicyItemAccess(
+                RangerPrivilege.RangerHdfsPrivilege.WRITE.toString()),
+            new RangerPolicy.RangerPolicyItemAccess(
+                RangerPrivilege.RangerHdfsPrivilege.EXECUTE.toString())));
     updateOrCreateRangerPolicy(
         RangerDefines.SERVICE_TYPE_HDFS,
         RANGER_HDFS_REPO_NAME,
@@ -134,17 +155,18 @@ public class RangerITEnv {
 
     Map<String, RangerPolicy.RangerPolicyResource> policyResourceMap =
         ImmutableMap.of(
-            RangerDefines.RESOURCE_DATABASE,
+            "database",
             new RangerPolicy.RangerPolicyResource("information_schema"),
-            RangerDefines.RESOURCE_TABLE,
+            "table",
             new RangerPolicy.RangerPolicyResource("*"),
-            RangerDefines.RESOURCE_COLUMN,
+            "column",
             new RangerPolicy.RangerPolicyResource("*"));
     RangerPolicy.RangerPolicyItem policyItem = new 
RangerPolicy.RangerPolicyItem();
     policyItem.setGroups(Arrays.asList(RangerDefines.PUBLIC_GROUP));
     policyItem.setAccesses(
         Arrays.asList(
-            new 
RangerPolicy.RangerPolicyItemAccess(RangerDefines.ACCESS_TYPE_HIVE_SELECT)));
+            new RangerPolicy.RangerPolicyItemAccess(
+                RangerPrivilege.RangerHivePrivilege.SELECT.toString())));
     updateOrCreateRangerPolicy(
         RangerDefines.SERVICE_TYPE_HIVE,
         RANGER_HIVE_REPO_NAME,
@@ -176,7 +198,7 @@ public class RangerITEnv {
       Assertions.assertNotNull(createdService);
 
       Map<String, String> filter =
-          ImmutableMap.of(RangerDefines.SEARCH_FILTER_SERVICE_NAME, 
RANGER_TRINO_REPO_NAME);
+          ImmutableMap.of(SearchFilter.SERVICE_NAME, RANGER_TRINO_REPO_NAME);
       List<RangerService> services = rangerClient.findServices(filter);
       Assertions.assertEquals(RANGER_TRINO_TYPE, services.get(0).getType());
       Assertions.assertEquals(RANGER_TRINO_REPO_NAME, 
services.get(0).getName());
@@ -223,7 +245,7 @@ public class RangerITEnv {
       Assertions.assertNotNull(createdService);
 
       Map<String, String> filter =
-          ImmutableMap.of(RangerDefines.SEARCH_FILTER_SERVICE_NAME, 
RANGER_HIVE_REPO_NAME);
+          ImmutableMap.of(SearchFilter.SERVICE_NAME, RANGER_HIVE_REPO_NAME);
       List<RangerService> services = rangerClient.findServices(filter);
       Assertions.assertEquals(RANGER_HIVE_TYPE, services.get(0).getType());
       Assertions.assertEquals(RANGER_HIVE_REPO_NAME, 
services.get(0).getName());
@@ -280,7 +302,7 @@ public class RangerITEnv {
       Assertions.assertNotNull(createdService);
 
       Map<String, String> filter =
-          ImmutableMap.of(RangerDefines.SEARCH_FILTER_SERVICE_NAME, 
RANGER_HDFS_REPO_NAME);
+          ImmutableMap.of(SearchFilter.SERVICE_NAME, RANGER_HDFS_REPO_NAME);
       List<RangerService> services = rangerClient.findServices(filter);
       Assertions.assertEquals(RANGER_HDFS_TYPE, services.get(0).getType());
       Assertions.assertEquals(RANGER_HDFS_REPO_NAME, 
services.get(0).getName());
@@ -436,26 +458,26 @@ public class RangerITEnv {
 
     Map<String, String> resourceFilter = new HashMap<>(); // use to match the 
precise policy
     Map<String, String> policyFilter = new HashMap<>();
-    policyFilter.put(RangerDefines.SEARCH_FILTER_SERVICE_NAME, serviceName);
+    policyFilter.put(SearchFilter.SERVICE_NAME, serviceName);
     policyFilter.put(SearchFilter.POLICY_LABELS_PARTIAL, 
RangerHelper.MANAGED_BY_GRAVITINO);
     final int[] index = {0};
     policyResourceMap.forEach(
         (k, v) -> {
           if (type.equals(RANGER_HIVE_TYPE)) {
             if (index[0] == 0) {
-              policyFilter.put(RangerDefines.SEARCH_FILTER_DATABASE, 
v.getValues().get(0));
-              resourceFilter.put(RangerDefines.RESOURCE_DATABASE, 
v.getValues().get(0));
+              policyFilter.put(SEARCH_FILTER_DATABASE, v.getValues().get(0));
+              resourceFilter.put(RESOURCE_DATABASE, v.getValues().get(0));
             } else if (index[0] == 1) {
-              policyFilter.put(RangerDefines.SEARCH_FILTER_TABLE, 
v.getValues().get(0));
-              resourceFilter.put(RangerDefines.RESOURCE_TABLE, 
v.getValues().get(0));
+              policyFilter.put(SEARCH_FILTER_TABLE, v.getValues().get(0));
+              resourceFilter.put(RESOURCE_TABLE, v.getValues().get(0));
             } else if (index[0] == 2) {
-              policyFilter.put(RangerDefines.SEARCH_FILTER_COLUMN, 
v.getValues().get(0));
-              resourceFilter.put(RangerDefines.RESOURCE_TABLE, 
v.getValues().get(0));
+              policyFilter.put(SEARCH_FILTER_COLUMN, v.getValues().get(0));
+              resourceFilter.put(RESOURCE_TABLE, v.getValues().get(0));
             }
             index[0]++;
           } else if (type.equals(RANGER_HDFS_TYPE)) {
-            policyFilter.put(RangerDefines.SEARCH_FILTER_PATH, 
v.getValues().get(0));
-            resourceFilter.put(RangerDefines.RESOURCE_PATH, 
v.getValues().get(0));
+            policyFilter.put(SEARCH_FILTER_PATH, v.getValues().get(0));
+            resourceFilter.put(RESOURCE_PATH, v.getValues().get(0));
           }
         });
     try {
@@ -512,8 +534,7 @@ public class RangerITEnv {
   protected static void cleanAllPolicy(String serviceName) {
     try {
       List<RangerPolicy> policies =
-          rangerClient.findPolicies(
-              ImmutableMap.of(RangerDefines.SEARCH_FILTER_SERVICE_NAME, 
serviceName));
+          rangerClient.findPolicies(ImmutableMap.of(SearchFilter.SERVICE_NAME, 
serviceName));
       for (RangerPolicy policy : policies) {
         rangerClient.deletePolicy(policy.getId());
       }
diff --git a/docs/security/authorization-pushdown.md 
b/docs/security/authorization-pushdown.md
index bab70144f..e521402f6 100644
--- a/docs/security/authorization-pushdown.md
+++ b/docs/security/authorization-pushdown.md
@@ -30,8 +30,8 @@ Once you have used the correct configuration, you can perform 
authorization oper
 
 #### Example of using the Authorization Ranger Hive Plugin
 
-Suppose you have an Apache Hive service in your datacenter and have created a 
`hiveRepo` in Apache Ranger to manage its permissions. 
-The Ranger service is accessible at `172.0.0.100:6080`, with the username 
`Jack` and the password `PWD123`. 
+Suppose you have an Apache Hive service in your datacenter and have created a 
`hiveRepo` in Apache Ranger to manage its permissions.
+The Ranger service is accessible at `172.0.0.100:6080`, with the username 
`Jack` and the password `PWD123`.
 To add this Hive service to Gravitino using the Hive catalog, you'll need to 
configure the following parameters.
 
 ```properties
@@ -45,4 +45,4 @@ authorization.ranger.service.name=hiveRepo
 
 :::caution
 Gravitino 0.6.0 only supports the authorization Apache Ranger Hive service and 
more data source authorization is under development.
-:::
+:::
\ No newline at end of file
diff --git a/integration-test-common/build.gradle.kts 
b/integration-test-common/build.gradle.kts
index a25ad4cff..449c38efc 100644
--- a/integration-test-common/build.gradle.kts
+++ b/integration-test-common/build.gradle.kts
@@ -32,6 +32,7 @@ dependencies {
   testImplementation(project(":core"))
   testImplementation(project(":server"))
   testImplementation(project(":server-common"))
+  testImplementation(project(":authorizations:authorization-ranger"))
   testImplementation(libs.bundles.jetty)
   testImplementation(libs.bundles.jersey)
   testImplementation(libs.bundles.jwt)
diff --git 
a/integration-test-common/src/test/java/org/apache/gravitino/integration/test/container/RangerContainer.java
 
b/integration-test-common/src/test/java/org/apache/gravitino/integration/test/container/RangerContainer.java
index 54b2afc0c..1aa91e086 100644
--- 
a/integration-test-common/src/test/java/org/apache/gravitino/integration/test/container/RangerContainer.java
+++ 
b/integration-test-common/src/test/java/org/apache/gravitino/integration/test/container/RangerContainer.java
@@ -25,7 +25,7 @@ import com.google.common.collect.ImmutableSet;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
-import org.apache.ranger.RangerClient;
+import org.apache.gravitino.authorization.ranger.RangerClientExtension;
 import org.apache.ranger.RangerServiceException;
 import org.rnorth.ducttape.Preconditions;
 import org.slf4j.Logger;
@@ -38,7 +38,7 @@ public class RangerContainer extends BaseContainer {
   public static final String DEFAULT_IMAGE = 
System.getenv("GRAVITINO_CI_RANGER_DOCKER_IMAGE");
   public static final String HOST_NAME = "gravitino-ci-ranger";
   public static final int RANGER_SERVER_PORT = 6080;
-  public RangerClient rangerClient;
+  public RangerClientExtension rangerClient;
   private String rangerUrl;
 
   /**
@@ -83,7 +83,7 @@ public class RangerContainer extends BaseContainer {
     super.start();
 
     rangerUrl = String.format("http://localhost:%s";, 
this.getMappedPort(RANGER_SERVER_PORT));
-    rangerClient = new RangerClient(rangerUrl, authType, rangerUserName, 
rangerPassword, null);
+    rangerClient = new RangerClientExtension(rangerUrl, authType, 
rangerUserName, rangerPassword);
 
     Preconditions.check("Ranger container startup failed!", 
checkContainerStatus(10));
   }

Reply via email to