This is an automated email from the ASF dual-hosted git repository. liuxun 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 b151461c6 [#5731] feat(auth-ranger): RangerAuthorizationHDFSPlugin supports Fileset authorization (#5733) b151461c6 is described below commit b151461c69f6701ab4f7e8a60a291d064af39e86 Author: theoryxu <xuxiaothe...@gmail.com> AuthorDate: Fri Dec 13 13:17:55 2024 +0800 [#5731] feat(auth-ranger): RangerAuthorizationHDFSPlugin supports Fileset authorization (#5733) ### What changes were proposed in this pull request? RangerAuthorizationHDFSPlugin supports Fileset authorization ### Why are the changes needed? Fix: #5731 ### Does this PR introduce _any_ user-facing change? Addition property keys in Fileset ### How was this patch tested? ITs --------- Co-authored-by: theoryxu <theor...@tencent.com> --- .../authorization-ranger/build.gradle.kts | 2 +- .../authorization/ranger/RangerAuthorization.java | 2 + .../ranger/RangerAuthorizationHDFSPlugin.java | 252 +++++++++ .../ranger/RangerAuthorizationHadoopSQLPlugin.java | 81 ++- .../ranger/RangerAuthorizationPlugin.java | 93 +++- ...ect.java => RangerHadoopSQLMetadataObject.java} | 16 +- ...ct.java => RangerHadoopSQLSecurableObject.java} | 6 +- .../authorization/ranger/RangerHelper.java | 55 -- ...ject.java => RangerPathBaseMetadataObject.java} | 92 +--- ...ect.java => RangerPathBaseSecurableObject.java} | 23 +- .../ranger/reference/RangerDefines.java | 4 +- .../test/RangerAuthorizationHDFSPluginIT.java | 172 ++++++ .../test/RangerAuthorizationPluginIT.java | 58 ++- .../ranger/integration/test/RangerFilesetIT.java | 578 +++++++++++++++++++++ .../ranger/integration/test/RangerHiveE2EIT.java | 2 +- .../ranger/integration/test/RangerHiveIT.java | 10 +- .../ranger/integration/test/RangerITEnv.java | 43 +- .../integration/test/RangerIcebergE2EIT.java | 2 +- .../ranger/integration/test/RangerPaimonE2EIT.java | 2 +- 19 files changed, 1255 insertions(+), 238 deletions(-) diff --git a/authorizations/authorization-ranger/build.gradle.kts b/authorizations/authorization-ranger/build.gradle.kts index f83aee72c..a335e492b 100644 --- a/authorizations/authorization-ranger/build.gradle.kts +++ b/authorizations/authorization-ranger/build.gradle.kts @@ -133,7 +133,7 @@ tasks.test { doFirst { environment("HADOOP_USER_NAME", "gravitino") } - dependsOn(":catalogs:catalog-hive:jar", ":catalogs:catalog-hive:runtimeJars", ":catalogs:catalog-lakehouse-iceberg:jar", ":catalogs:catalog-lakehouse-iceberg:runtimeJars", ":catalogs:catalog-lakehouse-paimon:jar", ":catalogs:catalog-lakehouse-paimon:runtimeJars") + dependsOn(":catalogs:catalog-hive:jar", ":catalogs:catalog-hive:runtimeJars", ":catalogs:catalog-lakehouse-iceberg:jar", ":catalogs:catalog-lakehouse-iceberg:runtimeJars", ":catalogs:catalog-lakehouse-paimon:jar", ":catalogs:catalog-lakehouse-paimon:runtimeJars", ":catalogs:catalog-hadoop:jar", ":catalogs:catalog-hadoop:runtimeJars") val skipITs = project.hasProperty("skipITs") if (skipITs) { 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 ae656f981..04c40e219 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 @@ -37,6 +37,8 @@ public class RangerAuthorization extends BaseAuthorization<RangerAuthorization> case "lakehouse-iceberg": case "lakehouse-paimon": return RangerAuthorizationHadoopSQLPlugin.getInstance(metalake, config); + case "hadoop": + return RangerAuthorizationHDFSPlugin.getInstance(metalake, config); default: throw new IllegalArgumentException("Unknown catalog provider: " + catalogProvider); } 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 new file mode 100644 index 000000000..16ce5bba4 --- /dev/null +++ b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHDFSPlugin.java @@ -0,0 +1,252 @@ +/* + * 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.base.Preconditions; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.regex.Pattern; +import org.apache.gravitino.GravitinoEnv; +import org.apache.gravitino.MetadataObject; +import org.apache.gravitino.NameIdentifier; +import org.apache.gravitino.authorization.AuthorizationMetadataObject; +import org.apache.gravitino.authorization.AuthorizationPrivilege; +import org.apache.gravitino.authorization.AuthorizationSecurableObject; +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.catalog.FilesetDispatcher; +import org.apache.gravitino.exceptions.AuthorizationPluginException; +import org.apache.gravitino.file.Fileset; +import org.apache.ranger.plugin.model.RangerPolicy; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RangerAuthorizationHDFSPlugin extends RangerAuthorizationPlugin { + private static final Logger LOG = LoggerFactory.getLogger(RangerAuthorizationHDFSPlugin.class); + + private static final Pattern pattern = Pattern.compile("^hdfs://[^/]*"); + + private static volatile RangerAuthorizationHDFSPlugin instance = null; + + private RangerAuthorizationHDFSPlugin(String metalake, Map<String, String> config) { + super(metalake, config); + } + + public static synchronized RangerAuthorizationHDFSPlugin getInstance( + String metalake, Map<String, String> config) { + if (instance == null) { + synchronized (RangerAuthorizationHadoopSQLPlugin.class) { + if (instance == null) { + instance = new RangerAuthorizationHDFSPlugin(metalake, config); + } + } + } + return instance; + } + + @Override + public Map<Privilege.Name, Set<AuthorizationPrivilege>> privilegesMappingRule() { + return ImmutableMap.of( + Privilege.Name.READ_FILESET, + ImmutableSet.of( + RangerPrivileges.RangerHdfsPrivilege.READ, + RangerPrivileges.RangerHdfsPrivilege.EXECUTE), + Privilege.Name.WRITE_FILESET, + ImmutableSet.of( + RangerPrivileges.RangerHdfsPrivilege.WRITE, + RangerPrivileges.RangerHdfsPrivilege.EXECUTE)); + } + + @Override + public Set<AuthorizationPrivilege> ownerMappingRule() { + return ImmutableSet.of( + RangerPrivileges.RangerHdfsPrivilege.READ, + RangerPrivileges.RangerHdfsPrivilege.WRITE, + RangerPrivileges.RangerHdfsPrivilege.EXECUTE); + } + + @Override + public List<String> policyResourceDefinesRule() { + return ImmutableList.of(RangerDefines.PolicyResource.PATH.getName()); + } + + @Override + protected RangerPolicy createPolicyAddResources(AuthorizationMetadataObject metadataObject) { + RangerPolicy policy = new RangerPolicy(); + policy.setService(rangerServiceName); + policy.setName(metadataObject.fullName()); + RangerPolicy.RangerPolicyResource policyResource = + new RangerPolicy.RangerPolicyResource(metadataObject.names().get(0), false, true); + policy.getResources().put(RangerDefines.PolicyResource.PATH.getName(), policyResource); + return policy; + } + + @Override + public AuthorizationSecurableObject generateAuthorizationSecurableObject( + List<String> names, + AuthorizationMetadataObject.Type type, + Set<AuthorizationPrivilege> privileges) { + AuthorizationMetadataObject authMetadataObject = + new RangerPathBaseMetadataObject(AuthorizationMetadataObject.getLastName(names), type); + authMetadataObject.validateAuthorizationMetadataObject(); + return new RangerPathBaseSecurableObject( + authMetadataObject.name(), authMetadataObject.type(), privileges); + } + + @Override + public Set<Privilege.Name> allowPrivilegesRule() { + return ImmutableSet.of( + Privilege.Name.CREATE_FILESET, Privilege.Name.READ_FILESET, Privilege.Name.WRITE_FILESET); + } + + @Override + public Set<MetadataObject.Type> allowMetadataObjectTypesRule() { + return ImmutableSet.of( + MetadataObject.Type.FILESET, + MetadataObject.Type.SCHEMA, + MetadataObject.Type.CATALOG, + MetadataObject.Type.METALAKE); + } + + @Override + public List<AuthorizationSecurableObject> translatePrivilege(SecurableObject securableObject) { + List<AuthorizationSecurableObject> rangerSecurableObjects = new ArrayList<>(); + + securableObject.privileges().stream() + .filter(Objects::nonNull) + .forEach( + gravitinoPrivilege -> { + Set<AuthorizationPrivilege> rangerPrivileges = new HashSet<>(); + // Ignore unsupported privileges + if (!privilegesMappingRule().containsKey(gravitinoPrivilege.name())) { + return; + } + privilegesMappingRule().get(gravitinoPrivilege.name()).stream() + .forEach( + rangerPrivilege -> + rangerPrivileges.add( + new RangerPrivileges.RangerHivePrivilegeImpl( + rangerPrivilege, gravitinoPrivilege.condition()))); + + switch (gravitinoPrivilege.name()) { + case CREATE_FILESET: + // Ignore the Gravitino privilege `CREATE_FILESET` in the + // RangerAuthorizationHDFSPlugin + break; + case READ_FILESET: + case WRITE_FILESET: + switch (securableObject.type()) { + case METALAKE: + case CATALOG: + case SCHEMA: + break; + case FILESET: + rangerSecurableObjects.add( + generateAuthorizationSecurableObject( + translateMetadataObject(securableObject).names(), + RangerPathBaseMetadataObject.Type.PATH, + rangerPrivileges)); + break; + default: + throw new AuthorizationPluginException( + "The privilege %s is not supported for the securable object: %s", + gravitinoPrivilege.name(), securableObject.type()); + } + break; + default: + LOG.warn( + "RangerAuthorizationHDFSPlugin -> privilege {} is not supported for the securable object: {}", + gravitinoPrivilege.name(), + securableObject.type()); + } + }); + + return rangerSecurableObjects; + } + + @Override + public List<AuthorizationSecurableObject> translateOwner(MetadataObject gravitinoMetadataObject) { + List<AuthorizationSecurableObject> rangerSecurableObjects = new ArrayList<>(); + switch (gravitinoMetadataObject.type()) { + case METALAKE: + case CATALOG: + case SCHEMA: + return rangerSecurableObjects; + case FILESET: + rangerSecurableObjects.add( + generateAuthorizationSecurableObject( + translateMetadataObject(gravitinoMetadataObject).names(), + RangerPathBaseMetadataObject.Type.PATH, + ownerMappingRule())); + break; + default: + throw new AuthorizationPluginException( + "The owner privilege is not supported for the securable object: %s", + gravitinoMetadataObject.type()); + } + + return rangerSecurableObjects; + } + + @Override + public AuthorizationMetadataObject translateMetadataObject(MetadataObject metadataObject) { + Preconditions.checkArgument( + allowMetadataObjectTypesRule().contains(metadataObject.type()), + String.format( + "The metadata object type %s is not supported in the RangerAuthorizationHDFSPlugin", + metadataObject.type())); + List<String> nsMetadataObject = + Lists.newArrayList(SecurableObjects.DOT_SPLITTER.splitToList(metadataObject.fullName())); + Preconditions.checkArgument( + nsMetadataObject.size() > 0, "The metadata object must have at least one name."); + + if (metadataObject.type() == MetadataObject.Type.FILESET) { + RangerPathBaseMetadataObject rangerHDFSMetadataObject = + new RangerPathBaseMetadataObject( + getFileSetPath(metadataObject), RangerPathBaseMetadataObject.Type.PATH); + rangerHDFSMetadataObject.validateAuthorizationMetadataObject(); + return rangerHDFSMetadataObject; + } else { + return new RangerPathBaseMetadataObject("", RangerPathBaseMetadataObject.Type.PATH); + } + } + + public String getFileSetPath(MetadataObject metadataObject) { + FilesetDispatcher filesetDispatcher = GravitinoEnv.getInstance().filesetDispatcher(); + NameIdentifier identifier = + NameIdentifier.parse(String.format("%s.%s", metalake, metadataObject.fullName())); + Fileset fileset = filesetDispatcher.loadFileset(identifier); + Preconditions.checkArgument( + fileset != null, String.format("Fileset %s is not found", identifier)); + String filesetLocation = fileset.storageLocation(); + Preconditions.checkArgument( + filesetLocation != null, String.format("Fileset %s location is not found", identifier)); + return pattern.matcher(filesetLocation).replaceAll(""); + } +} 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 13b0400ec..0da5c105a 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 @@ -41,6 +41,7 @@ import org.apache.gravitino.authorization.SecurableObjects; import org.apache.gravitino.authorization.ranger.RangerPrivileges.RangerHadoopSQLPrivilege; import org.apache.gravitino.authorization.ranger.reference.RangerDefines.PolicyResource; import org.apache.gravitino.exceptions.AuthorizationPluginException; +import org.apache.ranger.plugin.model.RangerPolicy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -103,6 +104,38 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi PolicyResource.COLUMN.getName()); } + @Override + protected RangerPolicy createPolicyAddResources(AuthorizationMetadataObject metadataObject) { + RangerPolicy policy = new RangerPolicy(); + policy.setService(rangerServiceName); + policy.setName(metadataObject.fullName()); + List<String> nsMetadataObject = metadataObject.names(); + for (int i = 0; i < nsMetadataObject.size(); i++) { + RangerPolicy.RangerPolicyResource policyResource = + new RangerPolicy.RangerPolicyResource(nsMetadataObject.get(i)); + policy.getResources().put(policyResourceDefinesRule().get(i), policyResource); + } + return policy; + } + + @Override + public AuthorizationSecurableObject generateAuthorizationSecurableObject( + List<String> names, + AuthorizationMetadataObject.Type type, + Set<AuthorizationPrivilege> privileges) { + AuthorizationMetadataObject authMetadataObject = + new RangerHadoopSQLMetadataObject( + AuthorizationMetadataObject.getParentFullName(names), + AuthorizationMetadataObject.getLastName(names), + type); + authMetadataObject.validateAuthorizationMetadataObject(); + return new RangerHadoopSQLSecurableObject( + authMetadataObject.parent(), + authMetadataObject.name(), + authMetadataObject.type(), + privileges); + } + @Override /** Allow privilege operation defines rule. */ public Set<Privilege.Name> allowPrivilegesRule() { @@ -143,13 +176,13 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi AuthorizationSecurableObjects.add( generateAuthorizationSecurableObject( ImmutableList.of(RangerHelper.RESOURCE_ALL), - RangerMetadataObject.Type.SCHEMA, + RangerHadoopSQLMetadataObject.Type.SCHEMA, ownerMappingRule())); // Add `*.*` for the TABLE permission AuthorizationSecurableObjects.add( generateAuthorizationSecurableObject( ImmutableList.of(RangerHelper.RESOURCE_ALL, RangerHelper.RESOURCE_ALL), - RangerMetadataObject.Type.TABLE, + RangerHadoopSQLMetadataObject.Type.TABLE, ownerMappingRule())); // Add `*.*.*` for the COLUMN permission AuthorizationSecurableObjects.add( @@ -158,7 +191,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi RangerHelper.RESOURCE_ALL, RangerHelper.RESOURCE_ALL, RangerHelper.RESOURCE_ALL), - RangerMetadataObject.Type.COLUMN, + RangerHadoopSQLMetadataObject.Type.COLUMN, ownerMappingRule())); break; case SCHEMA: @@ -166,14 +199,14 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi AuthorizationSecurableObjects.add( generateAuthorizationSecurableObject( ImmutableList.of(gravitinoMetadataObject.name() /*Schema name*/), - RangerMetadataObject.Type.SCHEMA, + RangerHadoopSQLMetadataObject.Type.SCHEMA, ownerMappingRule())); // Add `{schema}.*` for the TABLE permission AuthorizationSecurableObjects.add( generateAuthorizationSecurableObject( ImmutableList.of( gravitinoMetadataObject.name() /*Schema name*/, RangerHelper.RESOURCE_ALL), - RangerMetadataObject.Type.TABLE, + RangerHadoopSQLMetadataObject.Type.TABLE, ownerMappingRule())); // Add `{schema}.*.*` for the COLUMN permission AuthorizationSecurableObjects.add( @@ -182,7 +215,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi gravitinoMetadataObject.name() /*Schema name*/, RangerHelper.RESOURCE_ALL, RangerHelper.RESOURCE_ALL), - RangerMetadataObject.Type.COLUMN, + RangerHadoopSQLMetadataObject.Type.COLUMN, ownerMappingRule())); break; case TABLE: @@ -190,7 +223,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi AuthorizationSecurableObjects.add( generateAuthorizationSecurableObject( translateMetadataObject(gravitinoMetadataObject).names(), - RangerMetadataObject.Type.TABLE, + RangerHadoopSQLMetadataObject.Type.TABLE, ownerMappingRule())); // Add `{schema}.{table}.*` for the COLUMN permission AuthorizationSecurableObjects.add( @@ -199,7 +232,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi translateMetadataObject(gravitinoMetadataObject).names().stream(), Stream.of(RangerHelper.RESOURCE_ALL)) .collect(Collectors.toList()), - RangerMetadataObject.Type.COLUMN, + RangerHadoopSQLMetadataObject.Type.COLUMN, ownerMappingRule())); break; default: @@ -245,7 +278,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi AuthorizationSecurableObjects.add( generateAuthorizationSecurableObject( ImmutableList.of(RangerHelper.RESOURCE_ALL), - RangerMetadataObject.Type.SCHEMA, + RangerHadoopSQLMetadataObject.Type.SCHEMA, rangerPrivileges)); break; default: @@ -262,7 +295,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi AuthorizationSecurableObjects.add( generateAuthorizationSecurableObject( ImmutableList.of(RangerHelper.RESOURCE_ALL), - RangerMetadataObject.Type.SCHEMA, + RangerHadoopSQLMetadataObject.Type.SCHEMA, rangerPrivileges)); break; default: @@ -279,7 +312,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi AuthorizationSecurableObjects.add( generateAuthorizationSecurableObject( ImmutableList.of(RangerHelper.RESOURCE_ALL), - RangerMetadataObject.Type.SCHEMA, + RangerHadoopSQLMetadataObject.Type.SCHEMA, rangerPrivileges)); break; case SCHEMA: @@ -287,7 +320,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi AuthorizationSecurableObjects.add( generateAuthorizationSecurableObject( ImmutableList.of(securableObject.name() /*Schema name*/), - RangerMetadataObject.Type.SCHEMA, + RangerHadoopSQLMetadataObject.Type.SCHEMA, rangerPrivileges)); break; default: @@ -307,7 +340,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi generateAuthorizationSecurableObject( ImmutableList.of( RangerHelper.RESOURCE_ALL, RangerHelper.RESOURCE_ALL), - RangerMetadataObject.Type.TABLE, + RangerHadoopSQLMetadataObject.Type.TABLE, rangerPrivileges)); // Add `*.*.*` for the COLUMN permission AuthorizationSecurableObjects.add( @@ -316,7 +349,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi RangerHelper.RESOURCE_ALL, RangerHelper.RESOURCE_ALL, RangerHelper.RESOURCE_ALL), - RangerMetadataObject.Type.COLUMN, + RangerHadoopSQLMetadataObject.Type.COLUMN, rangerPrivileges)); break; case SCHEMA: @@ -326,7 +359,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi ImmutableList.of( securableObject.name() /*Schema name*/, RangerHelper.RESOURCE_ALL), - RangerMetadataObject.Type.TABLE, + RangerHadoopSQLMetadataObject.Type.TABLE, rangerPrivileges)); // Add `{schema}.*.*` for the COLUMN permission AuthorizationSecurableObjects.add( @@ -335,7 +368,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi securableObject.name() /*Schema name*/, RangerHelper.RESOURCE_ALL, RangerHelper.RESOURCE_ALL), - RangerMetadataObject.Type.COLUMN, + RangerHadoopSQLMetadataObject.Type.COLUMN, rangerPrivileges)); break; case TABLE: @@ -348,7 +381,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi AuthorizationSecurableObjects.add( generateAuthorizationSecurableObject( translateMetadataObject(securableObject).names(), - RangerMetadataObject.Type.TABLE, + RangerHadoopSQLMetadataObject.Type.TABLE, rangerPrivileges)); // Add `{schema}.{table}.*` for the COLUMN permission AuthorizationSecurableObjects.add( @@ -357,7 +390,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi translateMetadataObject(securableObject).names().stream(), Stream.of(RangerHelper.RESOURCE_ALL)) .collect(Collectors.toList()), - RangerMetadataObject.Type.COLUMN, + RangerHadoopSQLMetadataObject.Type.COLUMN, rangerPrivileges)); } break; @@ -403,18 +436,18 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi || metadataObject.type() == MetadataObject.Type.CATALOG) { nsMetadataObject.clear(); nsMetadataObject.add(RangerHelper.RESOURCE_ALL); - type = RangerMetadataObject.Type.SCHEMA; + type = RangerHadoopSQLMetadataObject.Type.SCHEMA; } else { nsMetadataObject.remove(0); // Remove the catalog name - type = RangerMetadataObject.Type.fromMetadataType(metadataObject.type()); + type = RangerHadoopSQLMetadataObject.Type.fromMetadataType(metadataObject.type()); } - RangerMetadataObject rangerMetadataObject = - new RangerMetadataObject( + RangerHadoopSQLMetadataObject rangerHadoopSQLMetadataObject = + new RangerHadoopSQLMetadataObject( AuthorizationMetadataObject.getParentFullName(nsMetadataObject), AuthorizationMetadataObject.getLastName(nsMetadataObject), type); - rangerMetadataObject.validateAuthorizationMetadataObject(); - return rangerMetadataObject; + rangerHadoopSQLMetadataObject.validateAuthorizationMetadataObject(); + return rangerHadoopSQLMetadataObject; } } 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 d2b1b7570..a3ce047aa 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 @@ -122,6 +122,57 @@ public abstract class RangerAuthorizationPlugin */ public abstract List<String> policyResourceDefinesRule(); + /** + * Create a new policy for metadata object + * + * @return The RangerPolicy for metadata object. + */ + protected abstract RangerPolicy createPolicyAddResources( + AuthorizationMetadataObject metadataObject); + + protected RangerPolicy addOwnerToNewPolicy( + AuthorizationMetadataObject metadataObject, Owner newOwner) { + RangerPolicy policy = createPolicyAddResources(metadataObject); + ownerMappingRule() + .forEach( + 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.getName())); + if (newOwner != null) { + if (newOwner.type() == Owner.Type.USER) { + policyItem.getUsers().add(newOwner.name()); + } else { + policyItem.getGroups().add(newOwner.name()); + } + // mark the policy item is created by Gravitino + policyItem.getRoles().add(RangerHelper.GRAVITINO_OWNER_ROLE); + } + policy.getPolicyItems().add(policyItem); + }); + return policy; + } + + protected RangerPolicy addOwnerRoleToNewPolicy( + AuthorizationMetadataObject metadataObject, String ownerRoleName) { + RangerPolicy policy = createPolicyAddResources(metadataObject); + + ownerMappingRule() + .forEach( + 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.getName())); + policyItem.getRoles().add(rangerHelper.generateGravitinoRoleName(ownerRoleName)); + policy.getPolicyItems().add(policyItem); + }); + return policy; + } + /** * Create a new role in the Ranger. <br> * 1. Create a policy for metadata object. <br> @@ -277,9 +328,11 @@ public abstract class RangerAuthorizationPlugin } else if (change instanceof MetadataObjectChange.RemoveMetadataObject) { MetadataObject metadataObject = ((MetadataObjectChange.RemoveMetadataObject) change).metadataObject(); - AuthorizationMetadataObject AuthorizationMetadataObject = - translateMetadataObject(metadataObject); - doRemoveMetadataObject(AuthorizationMetadataObject); + if (metadataObject.type() != MetadataObject.Type.FILESET) { + AuthorizationMetadataObject AuthorizationMetadataObject = + translateMetadataObject(metadataObject); + doRemoveMetadataObject(AuthorizationMetadataObject); + } } else { throw new IllegalArgumentException( "Unsupported metadata object change type: " @@ -385,9 +438,7 @@ public abstract class RangerAuthorizationPlugin rangerHelper.findManagedPolicy(AuthorizationSecurableObject); try { if (policy == null) { - policy = - rangerHelper.addOwnerRoleToNewPolicy( - AuthorizationSecurableObject, ownerRoleName); + policy = addOwnerRoleToNewPolicy(AuthorizationSecurableObject, ownerRoleName); rangerClient.createPolicy(policy); } else { rangerHelper.updatePolicyOwnerRole(policy, ownerRoleName); @@ -401,6 +452,7 @@ public abstract class RangerAuthorizationPlugin break; case SCHEMA: case TABLE: + case FILESET: // The schema and table use user/group to manage the owner AuthorizationSecurableObjects.stream() .forEach( @@ -409,8 +461,7 @@ public abstract class RangerAuthorizationPlugin rangerHelper.findManagedPolicy(AuthorizationSecurableObject); try { if (policy == null) { - policy = - rangerHelper.addOwnerToNewPolicy(AuthorizationSecurableObject, newOwner); + policy = addOwnerToNewPolicy(AuthorizationSecurableObject, newOwner); rangerClient.createPolicy(policy); } else { rangerHelper.updatePolicyOwner(policy, preOwner, newOwner); @@ -684,7 +735,7 @@ public abstract class RangerAuthorizationPlugin return true; } } else { - policy = rangerHelper.createPolicyAddResources(securableObject); + policy = createPolicyAddResources(securableObject); } rangerHelper.addPolicyItem(policy, roleName, securableObject); @@ -807,6 +858,9 @@ public abstract class RangerAuthorizationPlugin case COLUMN: removePolicyByMetadataObject(authMetadataObject.names()); break; + case FILESET: + // can not get fileset path in this case, do nothing + break; default: throw new IllegalArgumentException( "Unsupported metadata object type: " + authMetadataObject.type()); @@ -819,7 +873,7 @@ public abstract class RangerAuthorizationPlugin */ private void doRemoveSchemaMetadataObject(AuthorizationMetadataObject authMetadataObject) { Preconditions.checkArgument( - authMetadataObject.type() == RangerMetadataObject.Type.SCHEMA, + authMetadataObject.type() == RangerHadoopSQLMetadataObject.Type.SCHEMA, "The metadata object type must be SCHEMA"); Preconditions.checkArgument( authMetadataObject.names().size() == 1, "The metadata object names must be 1"); @@ -894,6 +948,9 @@ public abstract class RangerAuthorizationPlugin case COLUMN: doRenameColumnMetadataObject(AuthorizationMetadataObject, newAuthMetadataObject); break; + case FILESET: + // do nothing when fileset is renamed + break; default: throw new IllegalArgumentException( "Unsupported metadata object type: " + AuthorizationMetadataObject.type()); @@ -1083,22 +1140,10 @@ public abstract class RangerAuthorizationPlugin public void close() throws IOException {} /** Generate authorization securable object */ - public AuthorizationSecurableObject generateAuthorizationSecurableObject( + public abstract AuthorizationSecurableObject generateAuthorizationSecurableObject( List<String> names, AuthorizationMetadataObject.Type type, - Set<AuthorizationPrivilege> privileges) { - AuthorizationMetadataObject authMetadataObject = - new RangerMetadataObject( - AuthorizationMetadataObject.getParentFullName(names), - AuthorizationMetadataObject.getLastName(names), - type); - authMetadataObject.validateAuthorizationMetadataObject(); - return new RangerSecurableObject( - authMetadataObject.parent(), - authMetadataObject.name(), - authMetadataObject.type(), - privileges); - } + Set<AuthorizationPrivilege> privileges); public boolean validAuthorizationOperation(List<SecurableObject> securableObjects) { return securableObjects.stream() diff --git a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObject.java b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerHadoopSQLMetadataObject.java similarity index 88% copy from authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObject.java copy to authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerHadoopSQLMetadataObject.java index b9354ee46..8462a0e07 100644 --- a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObject.java +++ b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerHadoopSQLMetadataObject.java @@ -24,7 +24,7 @@ import org.apache.gravitino.MetadataObject; import org.apache.gravitino.authorization.AuthorizationMetadataObject; /** The helper class for {@link AuthorizationMetadataObject}. */ -public class RangerMetadataObject implements AuthorizationMetadataObject { +public class RangerHadoopSQLMetadataObject implements AuthorizationMetadataObject { /** * The type of object in the Ranger system. Every type will map one kind of the entity of the * Gravitino type system. @@ -36,7 +36,6 @@ public class RangerMetadataObject implements AuthorizationMetadataObject { TABLE(MetadataObject.Type.TABLE), /** A column is a sub-collection of the table that represents a group of same type data. */ COLUMN(MetadataObject.Type.COLUMN); - private final MetadataObject.Type metadataType; Type(MetadataObject.Type type) { @@ -72,7 +71,8 @@ public class RangerMetadataObject implements AuthorizationMetadataObject { * @param name The name of the metadata object * @param type The type of the metadata object */ - public RangerMetadataObject(String parent, String name, AuthorizationMetadataObject.Type type) { + public RangerHadoopSQLMetadataObject( + String parent, String name, AuthorizationMetadataObject.Type type) { this.parent = parent; this.name = name; this.type = type; @@ -110,15 +110,15 @@ public class RangerMetadataObject implements AuthorizationMetadataObject { type != null, "Cannot create a Ranger metadata object with no type"); Preconditions.checkArgument( - names.size() != 1 || type == RangerMetadataObject.Type.SCHEMA, + names.size() != 1 || type == RangerHadoopSQLMetadataObject.Type.SCHEMA, "If the length of names is 1, it must be the SCHEMA type"); Preconditions.checkArgument( - names.size() != 2 || type == RangerMetadataObject.Type.TABLE, + names.size() != 2 || type == RangerHadoopSQLMetadataObject.Type.TABLE, "If the length of names is 2, it must be the TABLE type"); Preconditions.checkArgument( - names.size() != 3 || type == RangerMetadataObject.Type.COLUMN, + names.size() != 3 || type == RangerHadoopSQLMetadataObject.Type.COLUMN, "If the length of names is 3, it must be COLUMN"); for (String name : names) { @@ -132,11 +132,11 @@ public class RangerMetadataObject implements AuthorizationMetadataObject { return true; } - if (!(o instanceof RangerMetadataObject)) { + if (!(o instanceof RangerHadoopSQLMetadataObject)) { return false; } - RangerMetadataObject that = (RangerMetadataObject) o; + RangerHadoopSQLMetadataObject that = (RangerHadoopSQLMetadataObject) o; return java.util.Objects.equals(name, that.name) && java.util.Objects.equals(parent, that.parent) && type == that.type; diff --git a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObject.java b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerHadoopSQLSecurableObject.java similarity index 90% copy from authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObject.java copy to authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerHadoopSQLSecurableObject.java index 3a6294f82..4aabdc4c3 100644 --- a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObject.java +++ b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerHadoopSQLSecurableObject.java @@ -26,8 +26,8 @@ import org.apache.gravitino.authorization.AuthorizationMetadataObject; import org.apache.gravitino.authorization.AuthorizationPrivilege; import org.apache.gravitino.authorization.AuthorizationSecurableObject; -/** The helper class for {@link RangerSecurableObject}. */ -public class RangerSecurableObject extends RangerMetadataObject +/** The helper class for {@link RangerHadoopSQLSecurableObject}. */ +public class RangerHadoopSQLSecurableObject extends RangerHadoopSQLMetadataObject implements AuthorizationSecurableObject { private final List<AuthorizationPrivilege> privileges; @@ -38,7 +38,7 @@ public class RangerSecurableObject extends RangerMetadataObject * @param name The name of the metadata object * @param type The type of the metadata object */ - public RangerSecurableObject( + public RangerHadoopSQLSecurableObject( String parent, String name, AuthorizationMetadataObject.Type type, 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 d955f7656..4c2b2956c 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 @@ -442,61 +442,6 @@ public class RangerHelper { }); } - protected RangerPolicy createPolicyAddResources(AuthorizationMetadataObject metadataObject) { - RangerPolicy policy = new RangerPolicy(); - policy.setService(rangerServiceName); - policy.setName(metadataObject.fullName()); - List<String> nsMetadataObject = metadataObject.names(); - for (int i = 0; i < nsMetadataObject.size(); i++) { - RangerPolicy.RangerPolicyResource policyResource = - new RangerPolicy.RangerPolicyResource(nsMetadataObject.get(i)); - policy.getResources().put(policyResourceDefines.get(i), policyResource); - } - return policy; - } - - protected RangerPolicy addOwnerToNewPolicy( - AuthorizationMetadataObject metadataObject, Owner newOwner) { - RangerPolicy policy = createPolicyAddResources(metadataObject); - - ownerPrivileges.forEach( - 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.getName())); - if (newOwner != null) { - if (newOwner.type() == Owner.Type.USER) { - policyItem.getUsers().add(newOwner.name()); - } else { - policyItem.getGroups().add(newOwner.name()); - } - // mark the policy item is created by Gravitino - policyItem.getRoles().add(GRAVITINO_OWNER_ROLE); - } - policy.getPolicyItems().add(policyItem); - }); - return policy; - } - - protected RangerPolicy addOwnerRoleToNewPolicy( - AuthorizationMetadataObject metadataObject, String ownerRoleName) { - RangerPolicy policy = createPolicyAddResources(metadataObject); - - ownerPrivileges.forEach( - 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.getName())); - policyItem.getRoles().add(generateGravitinoRoleName(ownerRoleName)); - policy.getPolicyItems().add(policyItem); - }); - return policy; - } - protected void updatePolicyOwnerRole(RangerPolicy policy, String ownerRoleName) { // Find matching policy items based on the owner's privileges List<RangerPolicy.RangerPolicyItem> matchPolicyItems = diff --git a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObject.java b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPathBaseMetadataObject.java similarity index 52% rename from authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObject.java rename to authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPathBaseMetadataObject.java index b9354ee46..775234641 100644 --- a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObject.java +++ b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPathBaseMetadataObject.java @@ -19,24 +19,20 @@ package org.apache.gravitino.authorization.ranger; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; import java.util.List; +import javax.annotation.Nullable; import org.apache.gravitino.MetadataObject; import org.apache.gravitino.authorization.AuthorizationMetadataObject; -/** The helper class for {@link AuthorizationMetadataObject}. */ -public class RangerMetadataObject implements AuthorizationMetadataObject { +public class RangerPathBaseMetadataObject implements AuthorizationMetadataObject { /** * The type of object in the Ranger system. Every type will map one kind of the entity of the * Gravitino type system. */ public enum Type implements AuthorizationMetadataObject.Type { - /** A schema is a sub collection of the catalog. The schema can contain tables, columns, etc. */ - SCHEMA(MetadataObject.Type.SCHEMA), - /** A table is mapped the table of relational data sources like Apache Hive, MySQL, etc. */ - TABLE(MetadataObject.Type.TABLE), - /** A column is a sub-collection of the table that represents a group of same type data. */ - COLUMN(MetadataObject.Type.COLUMN); - + /** A path is mapped the path of storages like HDFS, S3 etc. */ + PATH(MetadataObject.Type.FILESET); private final MetadataObject.Type metadataType; Type(MetadataObject.Type type) { @@ -47,8 +43,9 @@ public class RangerMetadataObject implements AuthorizationMetadataObject { return metadataType; } - public static Type fromMetadataType(MetadataObject.Type metadataType) { - for (Type type : Type.values()) { + public static RangerHadoopSQLMetadataObject.Type fromMetadataType( + MetadataObject.Type metadataType) { + for (RangerHadoopSQLMetadataObject.Type type : RangerHadoopSQLMetadataObject.Type.values()) { if (type.metadataObjectType() == metadataType) { return type; } @@ -58,44 +55,34 @@ public class RangerMetadataObject implements AuthorizationMetadataObject { } } - /** The implementation of the {@link MetadataObject}. */ - private final String name; - - private final String parent; + private final String path; private final AuthorizationMetadataObject.Type type; - /** - * Create the metadata object with the given name, parent and type. - * - * @param parent The parent of the metadata object - * @param name The name of the metadata object - * @param type The type of the metadata object - */ - public RangerMetadataObject(String parent, String name, AuthorizationMetadataObject.Type type) { - this.parent = parent; - this.name = name; + public RangerPathBaseMetadataObject(String path, AuthorizationMetadataObject.Type type) { + this.path = path; this.type = type; } + @Nullable @Override - public String name() { - return name; + public String parent() { + return null; } @Override - public List<String> names() { - return DOT_SPLITTER.splitToList(fullName()); + public String name() { + return this.path; } @Override - public String parent() { - return parent; + public List<String> names() { + return ImmutableList.of(this.path); } @Override public AuthorizationMetadataObject.Type type() { - return type; + return this.type; } @Override @@ -104,51 +91,16 @@ public class RangerMetadataObject implements AuthorizationMetadataObject { Preconditions.checkArgument( names != null && !names.isEmpty(), "Cannot create a Ranger metadata object with no names"); Preconditions.checkArgument( - names.size() <= 3, - "Cannot create a Ranger metadata object with the name length which is greater than 3"); + names.size() == 1, + "Cannot create a Ranger metadata object with the name length which is 1"); Preconditions.checkArgument( type != null, "Cannot create a Ranger metadata object with no type"); Preconditions.checkArgument( - names.size() != 1 || type == RangerMetadataObject.Type.SCHEMA, - "If the length of names is 1, it must be the SCHEMA type"); - - Preconditions.checkArgument( - names.size() != 2 || type == RangerMetadataObject.Type.TABLE, - "If the length of names is 2, it must be the TABLE type"); - - Preconditions.checkArgument( - names.size() != 3 || type == RangerMetadataObject.Type.COLUMN, - "If the length of names is 3, it must be COLUMN"); + type == RangerPathBaseMetadataObject.Type.PATH, "it must be the PATH type"); for (String name : names) { Preconditions.checkArgument(name != null, "Cannot create a metadata object with null name"); } } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - - if (!(o instanceof RangerMetadataObject)) { - return false; - } - - RangerMetadataObject that = (RangerMetadataObject) o; - return java.util.Objects.equals(name, that.name) - && java.util.Objects.equals(parent, that.parent) - && type == that.type; - } - - @Override - public int hashCode() { - return java.util.Objects.hash(name, parent, type); - } - - @Override - public String toString() { - return "MetadataObject: [fullName=" + fullName() + "], [type=" + type + "]"; - } } diff --git a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObject.java b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPathBaseSecurableObject.java similarity index 66% rename from authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObject.java rename to authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPathBaseSecurableObject.java index 3a6294f82..bd2c73fda 100644 --- a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObject.java +++ b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPathBaseSecurableObject.java @@ -19,32 +19,21 @@ package org.apache.gravitino.authorization.ranger; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Sets; import java.util.List; import java.util.Set; import org.apache.gravitino.authorization.AuthorizationMetadataObject; import org.apache.gravitino.authorization.AuthorizationPrivilege; import org.apache.gravitino.authorization.AuthorizationSecurableObject; -/** The helper class for {@link RangerSecurableObject}. */ -public class RangerSecurableObject extends RangerMetadataObject +public class RangerPathBaseSecurableObject extends RangerPathBaseMetadataObject implements AuthorizationSecurableObject { + private final List<AuthorizationPrivilege> privileges; - /** - * Create the Ranger securable object with the given name, parent and type. - * - * @param parent The parent of the metadata object - * @param name The name of the metadata object - * @param type The type of the metadata object - */ - public RangerSecurableObject( - String parent, - String name, - AuthorizationMetadataObject.Type type, - Set<AuthorizationPrivilege> privileges) { - super(parent, name, type); - this.privileges = ImmutableList.copyOf(Sets.newHashSet(privileges)); + public RangerPathBaseSecurableObject( + String path, AuthorizationMetadataObject.Type type, Set<AuthorizationPrivilege> privileges) { + super(path, type); + this.privileges = ImmutableList.copyOf(privileges); } @Override 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 b81fc3fdc..570b0feec 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 @@ -37,8 +37,8 @@ public class RangerDefines { // In the Ranger 2.4.0 agents-common/src/main/resources/service-defs/ranger-servicedef-hive.json DATABASE("database"), TABLE("table"), - COLUMN("column"); - + COLUMN("column"), + PATH("path"); private final String name; PolicyResource(String name) { 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 new file mode 100644 index 000000000..e1eacba15 --- /dev/null +++ b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerAuthorizationHDFSPluginIT.java @@ -0,0 +1,172 @@ +/* + * 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.integration.test; + +import com.google.common.collect.Lists; +import java.util.List; +import org.apache.gravitino.MetadataObject; +import org.apache.gravitino.MetadataObjects; +import org.apache.gravitino.authorization.AuthorizationMetadataObject; +import org.apache.gravitino.authorization.AuthorizationSecurableObject; +import org.apache.gravitino.authorization.Privileges; +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.RangerPathBaseMetadataObject; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +@Tag("gravitino-docker-test") +public class RangerAuthorizationHDFSPluginIT { + + private static RangerAuthorizationPlugin rangerAuthPlugin; + + @BeforeAll + public static void setup() { + RangerITEnv.init(true); + rangerAuthPlugin = RangerITEnv.rangerAuthHDFSPlugin; + } + + @AfterAll + public static void cleanup() { + RangerITEnv.cleanup(); + } + + @Test + public void testTranslateMetadataObject() { + MetadataObject metalake = + MetadataObjects.parse(String.format("metalake1"), MetadataObject.Type.METALAKE); + Assertions.assertEquals( + RangerPathBaseMetadataObject.Type.PATH, + rangerAuthPlugin.translateMetadataObject(metalake).type()); + + MetadataObject catalog = + MetadataObjects.parse(String.format("catalog1"), MetadataObject.Type.CATALOG); + Assertions.assertEquals( + RangerPathBaseMetadataObject.Type.PATH, + rangerAuthPlugin.translateMetadataObject(catalog).type()); + + MetadataObject schema = + MetadataObjects.parse(String.format("catalog1.schema1"), MetadataObject.Type.SCHEMA); + Assertions.assertEquals( + RangerPathBaseMetadataObject.Type.PATH, + rangerAuthPlugin.translateMetadataObject(schema).type()); + + MetadataObject table = + MetadataObjects.parse(String.format("catalog1.schema1.tab1"), MetadataObject.Type.TABLE); + Assertions.assertThrows( + IllegalArgumentException.class, () -> rangerAuthPlugin.translateMetadataObject(table)); + + MetadataObject fileset = + MetadataObjects.parse( + String.format("catalog1.schema1.fileset1"), MetadataObject.Type.FILESET); + AuthorizationMetadataObject rangerFileset = rangerAuthPlugin.translateMetadataObject(fileset); + Assertions.assertEquals(1, rangerFileset.names().size()); + Assertions.assertEquals("/test", rangerFileset.fullName()); + Assertions.assertEquals(RangerPathBaseMetadataObject.Type.PATH, rangerFileset.type()); + } + + @Test + public void testTranslatePrivilege() { + SecurableObject filesetInMetalake = + SecurableObjects.parse( + String.format("metalake1"), + MetadataObject.Type.METALAKE, + Lists.newArrayList( + Privileges.CreateFileset.allow(), + Privileges.ReadFileset.allow(), + Privileges.WriteFileset.allow())); + List<AuthorizationSecurableObject> filesetInMetalake1 = + rangerAuthPlugin.translatePrivilege(filesetInMetalake); + Assertions.assertEquals(0, filesetInMetalake1.size()); + + SecurableObject filesetInCatalog = + SecurableObjects.parse( + String.format("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()); + + SecurableObject filesetInSchema = + SecurableObjects.parse( + String.format("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()); + + SecurableObject filesetInFileset = + SecurableObjects.parse( + String.format("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()); + + filesetInFileset1.forEach( + securableObject -> { + Assertions.assertEquals(RangerPathBaseMetadataObject.Type.PATH, securableObject.type()); + Assertions.assertEquals("/test", securableObject.fullName()); + Assertions.assertEquals(2, securableObject.privileges().size()); + }); + } + + @Test + public void testTranslateOwner() { + MetadataObject metalake = + MetadataObjects.parse(String.format("metalake1"), MetadataObject.Type.METALAKE); + List<AuthorizationSecurableObject> metalakeOwner = rangerAuthPlugin.translateOwner(metalake); + Assertions.assertEquals(0, metalakeOwner.size()); + + MetadataObject catalog = + MetadataObjects.parse(String.format("catalog1"), MetadataObject.Type.CATALOG); + List<AuthorizationSecurableObject> catalogOwner = rangerAuthPlugin.translateOwner(catalog); + Assertions.assertEquals(0, catalogOwner.size()); + + MetadataObject schema = + MetadataObjects.parse(String.format("catalog1.schema1"), MetadataObject.Type.SCHEMA); + List<AuthorizationSecurableObject> schemaOwner = rangerAuthPlugin.translateOwner(schema); + Assertions.assertEquals(0, schemaOwner.size()); + + MetadataObject fileset = + MetadataObjects.parse( + String.format("catalog1.schema1.fileset1"), MetadataObject.Type.FILESET); + List<AuthorizationSecurableObject> filesetOwner = rangerAuthPlugin.translateOwner(fileset); + Assertions.assertEquals(1, filesetOwner.size()); + Assertions.assertEquals("/test", filesetOwner.get(0).fullName()); + Assertions.assertEquals(RangerPathBaseMetadataObject.Type.PATH, filesetOwner.get(0).type()); + Assertions.assertEquals(3, filesetOwner.get(0).privileges().size()); + } +} diff --git a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerAuthorizationPluginIT.java b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerAuthorizationPluginIT.java index 50ca331d2..74ddf0784 100644 --- a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerAuthorizationPluginIT.java +++ b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerAuthorizationPluginIT.java @@ -31,8 +31,9 @@ import org.apache.gravitino.authorization.Privileges; 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.RangerHadoopSQLMetadataObject; import org.apache.gravitino.authorization.ranger.RangerHelper; -import org.apache.gravitino.authorization.ranger.RangerMetadataObject; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Tag; @@ -44,10 +45,15 @@ public class RangerAuthorizationPluginIT { @BeforeAll public static void setup() { - RangerITEnv.init(); + RangerITEnv.init(true); rangerAuthPlugin = RangerITEnv.rangerAuthHivePlugin; } + @AfterAll + public static void cleanup() { + RangerITEnv.cleanup(); + } + @Test public void testTranslateMetadataObject() { MetadataObject metalake = @@ -55,21 +61,21 @@ public class RangerAuthorizationPluginIT { AuthorizationMetadataObject rangerMetalake = rangerAuthPlugin.translateMetadataObject(metalake); Assertions.assertEquals(1, rangerMetalake.names().size()); Assertions.assertEquals(RangerHelper.RESOURCE_ALL, rangerMetalake.names().get(0)); - Assertions.assertEquals(RangerMetadataObject.Type.SCHEMA, rangerMetalake.type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.SCHEMA, rangerMetalake.type()); MetadataObject catalog = MetadataObjects.parse(String.format("catalog1"), MetadataObject.Type.CATALOG); AuthorizationMetadataObject rangerCatalog = rangerAuthPlugin.translateMetadataObject(catalog); Assertions.assertEquals(1, rangerCatalog.names().size()); Assertions.assertEquals(RangerHelper.RESOURCE_ALL, rangerCatalog.names().get(0)); - Assertions.assertEquals(RangerMetadataObject.Type.SCHEMA, rangerCatalog.type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.SCHEMA, rangerCatalog.type()); MetadataObject schema = MetadataObjects.parse(String.format("catalog1.schema1"), MetadataObject.Type.SCHEMA); AuthorizationMetadataObject rangerSchema = rangerAuthPlugin.translateMetadataObject(schema); Assertions.assertEquals(1, rangerSchema.names().size()); Assertions.assertEquals("schema1", rangerSchema.names().get(0)); - Assertions.assertEquals(RangerMetadataObject.Type.SCHEMA, rangerSchema.type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.SCHEMA, rangerSchema.type()); MetadataObject table = MetadataObjects.parse(String.format("catalog1.schema1.tab1"), MetadataObject.Type.TABLE); @@ -77,7 +83,7 @@ public class RangerAuthorizationPluginIT { Assertions.assertEquals(2, rangerTable.names().size()); Assertions.assertEquals("schema1", rangerTable.names().get(0)); Assertions.assertEquals("tab1", rangerTable.names().get(1)); - Assertions.assertEquals(RangerMetadataObject.Type.TABLE, rangerTable.type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.TABLE, rangerTable.type()); } @Test @@ -92,7 +98,7 @@ public class RangerAuthorizationPluginIT { Assertions.assertEquals(1, createSchemaInMetalake1.size()); Assertions.assertEquals(RangerHelper.RESOURCE_ALL, createSchemaInMetalake1.get(0).fullName()); Assertions.assertEquals( - RangerMetadataObject.Type.SCHEMA, createSchemaInMetalake1.get(0).type()); + RangerHadoopSQLMetadataObject.Type.SCHEMA, createSchemaInMetalake1.get(0).type()); SecurableObject createSchemaInCatalog = SecurableObjects.parse( @@ -103,7 +109,8 @@ public class RangerAuthorizationPluginIT { rangerAuthPlugin.translatePrivilege(createSchemaInCatalog); Assertions.assertEquals(1, createSchemaInCatalog1.size()); Assertions.assertEquals(RangerHelper.RESOURCE_ALL, createSchemaInCatalog1.get(0).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.SCHEMA, createSchemaInCatalog1.get(0).type()); + Assertions.assertEquals( + RangerHadoopSQLMetadataObject.Type.SCHEMA, createSchemaInCatalog1.get(0).type()); for (Privilege privilege : ImmutableList.of( @@ -118,9 +125,9 @@ public class RangerAuthorizationPluginIT { List<AuthorizationSecurableObject> metalake1 = rangerAuthPlugin.translatePrivilege(metalake); Assertions.assertEquals(2, metalake1.size()); Assertions.assertEquals("*.*", metalake1.get(0).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.TABLE, metalake1.get(0).type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.TABLE, metalake1.get(0).type()); Assertions.assertEquals("*.*.*", metalake1.get(1).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.COLUMN, metalake1.get(1).type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.COLUMN, metalake1.get(1).type()); SecurableObject catalog = SecurableObjects.parse( @@ -130,9 +137,9 @@ public class RangerAuthorizationPluginIT { List<AuthorizationSecurableObject> catalog1 = rangerAuthPlugin.translatePrivilege(catalog); Assertions.assertEquals(2, catalog1.size()); Assertions.assertEquals("*.*", catalog1.get(0).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.TABLE, catalog1.get(0).type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.TABLE, catalog1.get(0).type()); Assertions.assertEquals("*.*.*", catalog1.get(1).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.COLUMN, catalog1.get(1).type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.COLUMN, catalog1.get(1).type()); SecurableObject schema = SecurableObjects.parse( @@ -142,9 +149,9 @@ public class RangerAuthorizationPluginIT { List<AuthorizationSecurableObject> schema1 = rangerAuthPlugin.translatePrivilege(schema); Assertions.assertEquals(2, schema1.size()); Assertions.assertEquals("schema1.*", schema1.get(0).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.TABLE, schema1.get(0).type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.TABLE, schema1.get(0).type()); Assertions.assertEquals("schema1.*.*", schema1.get(1).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.COLUMN, schema1.get(1).type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.COLUMN, schema1.get(1).type()); if (!privilege.equals(Privileges.CreateTable.allow())) { // `CREATE_TABLE` not support securable object for table, So ignore check for table. @@ -156,9 +163,9 @@ public class RangerAuthorizationPluginIT { List<AuthorizationSecurableObject> table1 = rangerAuthPlugin.translatePrivilege(table); Assertions.assertEquals(2, table1.size()); Assertions.assertEquals("schema1.table1", table1.get(0).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.TABLE, table1.get(0).type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.TABLE, table1.get(0).type()); Assertions.assertEquals("schema1.table1.*", table1.get(1).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.COLUMN, table1.get(1).type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.COLUMN, table1.get(1).type()); } } } @@ -171,31 +178,34 @@ public class RangerAuthorizationPluginIT { List<AuthorizationSecurableObject> metalakeOwner = rangerAuthPlugin.translateOwner(metalake); Assertions.assertEquals(3, metalakeOwner.size()); Assertions.assertEquals(RangerHelper.RESOURCE_ALL, metalakeOwner.get(0).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.SCHEMA, metalakeOwner.get(0).type()); + Assertions.assertEquals( + RangerHadoopSQLMetadataObject.Type.SCHEMA, metalakeOwner.get(0).type()); Assertions.assertEquals("*.*", metalakeOwner.get(1).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.TABLE, metalakeOwner.get(1).type()); + Assertions.assertEquals( + RangerHadoopSQLMetadataObject.Type.TABLE, metalakeOwner.get(1).type()); Assertions.assertEquals("*.*.*", metalakeOwner.get(2).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.COLUMN, metalakeOwner.get(2).type()); + Assertions.assertEquals( + RangerHadoopSQLMetadataObject.Type.COLUMN, metalakeOwner.get(2).type()); } MetadataObject schema = MetadataObjects.parse("catalog1.schema1", MetadataObject.Type.SCHEMA); List<AuthorizationSecurableObject> schemaOwner = rangerAuthPlugin.translateOwner(schema); Assertions.assertEquals(3, schemaOwner.size()); Assertions.assertEquals("schema1", schemaOwner.get(0).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.SCHEMA, schemaOwner.get(0).type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.SCHEMA, schemaOwner.get(0).type()); Assertions.assertEquals("schema1.*", schemaOwner.get(1).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.TABLE, schemaOwner.get(1).type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.TABLE, schemaOwner.get(1).type()); Assertions.assertEquals("schema1.*.*", schemaOwner.get(2).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.COLUMN, schemaOwner.get(2).type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.COLUMN, schemaOwner.get(2).type()); MetadataObject table = MetadataObjects.parse("catalog1.schema1.table1", MetadataObject.Type.TABLE); List<AuthorizationSecurableObject> tableOwner = rangerAuthPlugin.translateOwner(table); Assertions.assertEquals(2, tableOwner.size()); Assertions.assertEquals("schema1.table1", tableOwner.get(0).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.TABLE, tableOwner.get(0).type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.TABLE, tableOwner.get(0).type()); Assertions.assertEquals("schema1.table1.*", tableOwner.get(1).fullName()); - Assertions.assertEquals(RangerMetadataObject.Type.COLUMN, tableOwner.get(1).type()); + Assertions.assertEquals(RangerHadoopSQLMetadataObject.Type.COLUMN, tableOwner.get(1).type()); } @Test diff --git a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerFilesetIT.java b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerFilesetIT.java new file mode 100644 index 000000000..bbaae3278 --- /dev/null +++ b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerFilesetIT.java @@ -0,0 +1,578 @@ +/* + * 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.integration.test; + +import static org.apache.gravitino.Catalog.AUTHORIZATION_PROVIDER; +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.rangerHelper; +import static org.apache.gravitino.catalog.hive.HiveConstants.IMPERSONATION_ENABLE; +import static org.apache.gravitino.connector.AuthorizationPropertiesMeta.RANGER_AUTH_TYPE; +import static org.apache.gravitino.connector.AuthorizationPropertiesMeta.RANGER_PASSWORD; +import static org.apache.gravitino.connector.AuthorizationPropertiesMeta.RANGER_SERVICE_NAME; +import static org.apache.gravitino.connector.AuthorizationPropertiesMeta.RANGER_USERNAME; +import static org.apache.gravitino.integration.test.container.RangerContainer.RANGER_SERVER_PORT; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import java.io.IOException; +import java.security.PrivilegedExceptionAction; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import org.apache.gravitino.Catalog; +import org.apache.gravitino.Configs; +import org.apache.gravitino.MetadataObject; +import org.apache.gravitino.MetadataObjects; +import org.apache.gravitino.NameIdentifier; +import org.apache.gravitino.Schema; +import org.apache.gravitino.auth.AuthConstants; +import org.apache.gravitino.auth.AuthenticatorType; +import org.apache.gravitino.authorization.Privileges; +import org.apache.gravitino.authorization.SecurableObject; +import org.apache.gravitino.authorization.SecurableObjects; +import org.apache.gravitino.authorization.ranger.RangerHelper; +import org.apache.gravitino.authorization.ranger.RangerPrivileges; +import org.apache.gravitino.client.GravitinoMetalake; +import org.apache.gravitino.connector.AuthorizationPropertiesMeta; +import org.apache.gravitino.file.Fileset; +import org.apache.gravitino.integration.test.container.HiveContainer; +import org.apache.gravitino.integration.test.container.RangerContainer; +import org.apache.gravitino.integration.test.util.BaseIT; +import org.apache.gravitino.integration.test.util.GravitinoITUtils; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; +import org.apache.hadoop.fs.permission.FsPermission; +import org.apache.hadoop.security.UserGroupInformation; +import org.apache.ranger.RangerServiceException; +import org.apache.ranger.plugin.model.RangerPolicy; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Tag("gravitino-docker-test") +public class RangerFilesetIT extends BaseIT { + private static final Logger LOG = LoggerFactory.getLogger(RangerFilesetIT.class); + + private String RANGER_ADMIN_URL; + private String defaultBaseLocation; + private String metalakeName = "metalake"; + private String catalogName = GravitinoITUtils.genRandomName("RangerFilesetE2EIT_catalog"); + private String schemaName = GravitinoITUtils.genRandomName("RangerFilesetE2EIT_schema"); + private static final String provider = "hadoop"; + private FileSystem fileSystem; + private GravitinoMetalake metalake; + private Catalog catalog; + + @BeforeAll + public void startIntegrationTest() throws Exception { + // Enable Gravitino Authorization mode + Map<String, String> configs = Maps.newHashMap(); + configs.put(Configs.ENABLE_AUTHORIZATION.getKey(), String.valueOf(true)); + configs.put(Configs.SERVICE_ADMINS.getKey(), RangerITEnv.HADOOP_USER_NAME); + configs.put(Configs.AUTHENTICATORS.getKey(), AuthenticatorType.SIMPLE.name().toLowerCase()); + configs.put("SimpleAuthUserName", AuthConstants.ANONYMOUS_USER); + registerCustomConfigs(configs); + super.startIntegrationTest(); + + RangerITEnv.init(false); + RangerITEnv.startHiveRangerContainer(); + + RANGER_ADMIN_URL = + String.format( + "http://%s:%d", + containerSuite.getRangerContainer().getContainerIpAddress(), RANGER_SERVER_PORT); + + Configuration conf = new Configuration(); + conf.set("fs.defaultFS", defaultBaseLocation()); + fileSystem = FileSystem.get(conf); + + createCatalogAndSchema(); + } + + @AfterAll + public void stop() throws IOException { + if (client != null) { + Arrays.stream(catalog.asSchemas().listSchemas()) + .filter(schema -> !schema.equals("default")) + .forEach( + (schema -> { + catalog.asSchemas().dropSchema(schema, false); + })); + Arrays.stream(metalake.listCatalogs()) + .forEach((catalogName -> metalake.dropCatalog(catalogName, true))); + client.disableMetalake(metalakeName); + client.dropMetalake(metalakeName); + } + if (fileSystem != null) { + fileSystem.close(); + } + try { + closer.close(); + } catch (Exception e) { + LOG.error("Failed to close CloseableGroup", e); + } + client = null; + RangerITEnv.cleanup(); + } + + @Test + @Order(0) + void testReadWritePath() throws IOException, RangerServiceException { + String filename = GravitinoITUtils.genRandomName("RangerFilesetE2EIT_fileset"); + Fileset fileset = + catalog + .asFilesetCatalog() + .createFileset( + NameIdentifier.of(schemaName, filename), + "comment", + Fileset.Type.MANAGED, + storageLocation(filename), + null); + Assertions.assertTrue( + catalog.asFilesetCatalog().filesetExists(NameIdentifier.of(schemaName, fileset.name()))); + Assertions.assertTrue(fileSystem.exists(new Path(storageLocation(filename)))); + List<RangerPolicy> policies = + rangerClient.getPoliciesInService(RangerITEnv.RANGER_HDFS_REPO_NAME); + Assertions.assertEquals(1, policies.size()); + Assertions.assertEquals(3, policies.get(0).getPolicyItems().size()); + + Assertions.assertEquals( + 1, + policies.get(0).getPolicyItems().stream() + .filter(item -> item.getRoles().contains(RangerHelper.GRAVITINO_OWNER_ROLE)) + .filter( + item -> + item.getAccesses().stream() + .anyMatch( + access -> + access + .getType() + .equals(RangerPrivileges.RangerHdfsPrivilege.READ.getName()))) + .count()); + Assertions.assertEquals( + 1, + policies.get(0).getPolicyItems().stream() + .filter(item -> item.getRoles().contains(RangerHelper.GRAVITINO_OWNER_ROLE)) + .filter( + item -> + item.getAccesses().stream() + .anyMatch( + access -> + access + .getType() + .equals(RangerPrivileges.RangerHdfsPrivilege.WRITE.getName()))) + .count()); + Assertions.assertEquals( + 1, + policies.get(0).getPolicyItems().stream() + .filter(item -> item.getRoles().contains(RangerHelper.GRAVITINO_OWNER_ROLE)) + .filter( + item -> + item.getAccesses().stream() + .anyMatch( + access -> + access + .getType() + .equals( + RangerPrivileges.RangerHdfsPrivilege.EXECUTE.getName()))) + .count()); + + String filesetRole = currentFunName(); + SecurableObject securableObject = + SecurableObjects.parse( + String.format("%s.%s.%s", catalogName, schemaName, fileset.name()), + MetadataObject.Type.FILESET, + Lists.newArrayList(Privileges.ReadFileset.allow())); + metalake.createRole(filesetRole, Collections.emptyMap(), Lists.newArrayList(securableObject)); + + policies = rangerClient.getPoliciesInService(RangerITEnv.RANGER_HDFS_REPO_NAME); + Assertions.assertEquals(1, policies.size()); + Assertions.assertEquals(3, policies.get(0).getPolicyItems().size()); + Assertions.assertEquals( + 1, + policies.get(0).getPolicyItems().stream() + .filter( + item -> + item.getRoles().contains(rangerHelper.generateGravitinoRoleName(filesetRole))) + .filter( + item -> + item.getAccesses().stream() + .anyMatch( + access -> + access + .getType() + .equals(RangerPrivileges.RangerHdfsPrivilege.READ.getName()))) + .count()); + Assertions.assertEquals( + 0, + policies.get(0).getPolicyItems().stream() + .filter( + item -> + item.getRoles().contains(rangerHelper.generateGravitinoRoleName(filesetRole))) + .filter( + item -> + item.getAccesses().stream() + .anyMatch( + access -> + access + .getType() + .equals(RangerPrivileges.RangerHdfsPrivilege.WRITE.getName()))) + .count()); + Assertions.assertEquals( + 1, + policies.get(0).getPolicyItems().stream() + .filter( + item -> + item.getRoles().contains(rangerHelper.generateGravitinoRoleName(filesetRole))) + .filter( + item -> + item.getAccesses().stream() + .anyMatch( + access -> + access + .getType() + .equals( + RangerPrivileges.RangerHdfsPrivilege.EXECUTE.getName()))) + .count()); + + metalake.grantPrivilegesToRole( + filesetRole, + MetadataObjects.of( + String.format("%s.%s", catalogName, schemaName), + fileset.name(), + MetadataObject.Type.FILESET), + Lists.newArrayList(Privileges.WriteFileset.allow())); + + policies = rangerClient.getPoliciesInService(RangerITEnv.RANGER_HDFS_REPO_NAME); + Assertions.assertEquals(1, policies.size()); + Assertions.assertEquals(3, policies.get(0).getPolicyItems().size()); + Assertions.assertEquals( + 1, + policies.get(0).getPolicyItems().stream() + .filter( + item -> + item.getRoles().contains(rangerHelper.generateGravitinoRoleName(filesetRole))) + .filter( + item -> + item.getAccesses().stream() + .anyMatch( + access -> + access + .getType() + .equals(RangerPrivileges.RangerHdfsPrivilege.READ.getName()))) + .count()); + Assertions.assertEquals( + 1, + policies.get(0).getPolicyItems().stream() + .filter( + item -> + item.getRoles().contains(rangerHelper.generateGravitinoRoleName(filesetRole))) + .filter( + item -> + item.getAccesses().stream() + .anyMatch( + access -> + access + .getType() + .equals(RangerPrivileges.RangerHdfsPrivilege.WRITE.getName()))) + .count()); + Assertions.assertEquals( + 1, + policies.get(0).getPolicyItems().stream() + .filter( + item -> + item.getRoles().contains(rangerHelper.generateGravitinoRoleName(filesetRole))) + .filter( + item -> + item.getAccesses().stream() + .anyMatch( + access -> + access + .getType() + .equals( + RangerPrivileges.RangerHdfsPrivilege.EXECUTE.getName()))) + .count()); + + metalake.revokePrivilegesFromRole( + filesetRole, + MetadataObjects.of( + String.format("%s.%s", catalogName, schemaName), + fileset.name(), + MetadataObject.Type.FILESET), + Lists.newArrayList(Privileges.ReadFileset.allow(), Privileges.WriteFileset.allow())); + policies = rangerClient.getPoliciesInService(RangerITEnv.RANGER_HDFS_REPO_NAME); + Assertions.assertEquals(1, policies.size()); + Assertions.assertEquals(3, policies.get(0).getPolicyItems().size()); + Assertions.assertEquals( + 0, + policies.get(0).getPolicyItems().stream() + .filter( + item -> + item.getRoles().contains(rangerHelper.generateGravitinoRoleName(filesetRole))) + .filter( + item -> + item.getAccesses().stream() + .anyMatch( + access -> + access + .getType() + .equals(RangerPrivileges.RangerHdfsPrivilege.READ.getName()))) + .count()); + Assertions.assertEquals( + 0, + policies.get(0).getPolicyItems().stream() + .filter( + item -> + item.getRoles().contains(rangerHelper.generateGravitinoRoleName(filesetRole))) + .filter( + item -> + item.getAccesses().stream() + .anyMatch( + access -> + access + .getType() + .equals(RangerPrivileges.RangerHdfsPrivilege.WRITE.getName()))) + .count()); + Assertions.assertEquals( + 0, + policies.get(0).getPolicyItems().stream() + .filter( + item -> + item.getRoles().contains(rangerHelper.generateGravitinoRoleName(filesetRole))) + .filter( + item -> + item.getAccesses().stream() + .anyMatch( + access -> + access + .getType() + .equals( + RangerPrivileges.RangerHdfsPrivilege.EXECUTE.getName()))) + .count()); + + catalog.asFilesetCatalog().dropFileset(NameIdentifier.of(schemaName, fileset.name())); + policies = rangerClient.getPoliciesInService(RangerITEnv.RANGER_HDFS_REPO_NAME); + Assertions.assertEquals(1, policies.size()); + Assertions.assertEquals(3, policies.get(0).getPolicyItems().size()); + } + + @Test + @Order(1) + void testReadWritePathE2E() throws IOException, RangerServiceException, InterruptedException { + String filenameRole = GravitinoITUtils.genRandomName("RangerFilesetE2EIT_fileset"); + Fileset fileset = + catalog + .asFilesetCatalog() + .createFileset( + NameIdentifier.of(schemaName, filenameRole), + "comment", + Fileset.Type.MANAGED, + storageLocation(filenameRole), + null); + Assertions.assertTrue( + catalog.asFilesetCatalog().filesetExists(NameIdentifier.of(schemaName, fileset.name()))); + Assertions.assertTrue(fileSystem.exists(new Path(storageLocation(filenameRole)))); + FsPermission permission = new FsPermission("700"); + fileSystem.setPermission(new Path(storageLocation(filenameRole)), permission); + + String userName = "userTestReadWritePathE2E"; + metalake.addUser(userName); + + UserGroupInformation.createProxyUser(userName, UserGroupInformation.getCurrentUser()) + .doAs( + (PrivilegedExceptionAction<Void>) + () -> { + Configuration conf = new Configuration(); + conf.set("fs.defaultFS", defaultBaseLocation()); + FileSystem userFileSystem = FileSystem.get(conf); + Assertions.assertThrows( + Exception.class, + () -> + userFileSystem.listFiles(new Path(storageLocation(filenameRole)), false)); + Assertions.assertThrows( + Exception.class, + () -> + userFileSystem.mkdirs( + new Path( + String.format("%s/%s", storageLocation(filenameRole), "test1")))); + userFileSystem.close(); + return null; + }); + + String filesetRole = currentFunName() + "_testReadWritePathE2E"; + SecurableObject securableObject = + SecurableObjects.parse( + String.format("%s.%s.%s", catalogName, schemaName, fileset.name()), + MetadataObject.Type.FILESET, + Lists.newArrayList(Privileges.ReadFileset.allow())); + metalake.createRole(filesetRole, Collections.emptyMap(), Lists.newArrayList(securableObject)); + metalake.grantRolesToUser(Lists.newArrayList(filesetRole), userName); + RangerBaseE2EIT.waitForUpdatingPolicies(); + + UserGroupInformation.createProxyUser(userName, UserGroupInformation.getCurrentUser()) + .doAs( + (PrivilegedExceptionAction<Void>) + () -> { + FileSystem userFileSystem = + FileSystem.get( + new Configuration() { + { + set("fs.defaultFS", defaultBaseLocation()); + } + }); + Assertions.assertDoesNotThrow( + () -> + userFileSystem.listFiles(new Path(storageLocation(filenameRole)), false)); + Assertions.assertThrows( + Exception.class, + () -> + userFileSystem.mkdirs( + new Path( + String.format("%s/%s", storageLocation(filenameRole), "test2")))); + userFileSystem.close(); + return null; + }); + + MetadataObject filesetObject = + MetadataObjects.of( + String.format("%s.%s", catalogName, schemaName), + fileset.name(), + MetadataObject.Type.FILESET); + metalake.grantPrivilegesToRole( + filesetRole, filesetObject, Lists.newArrayList(Privileges.WriteFileset.allow())); + RangerBaseE2EIT.waitForUpdatingPolicies(); + UserGroupInformation.createProxyUser(userName, UserGroupInformation.getCurrentUser()) + .doAs( + (PrivilegedExceptionAction<Void>) + () -> { + FileSystem userFileSystem = + FileSystem.get( + new Configuration() { + { + set("fs.defaultFS", defaultBaseLocation()); + } + }); + Assertions.assertDoesNotThrow( + () -> + userFileSystem.listFiles(new Path(storageLocation(filenameRole)), false)); + Assertions.assertDoesNotThrow( + () -> + userFileSystem.mkdirs( + new Path( + String.format("%s/%s", storageLocation(filenameRole), "test3")))); + userFileSystem.close(); + return null; + }); + + metalake.revokePrivilegesFromRole( + filesetRole, + filesetObject, + Lists.newArrayList(Privileges.ReadFileset.allow(), Privileges.WriteFileset.allow())); + RangerBaseE2EIT.waitForUpdatingPolicies(); + UserGroupInformation.createProxyUser(userName, UserGroupInformation.getCurrentUser()) + .doAs( + (PrivilegedExceptionAction<Void>) + () -> { + FileSystem userFileSystem = + FileSystem.get( + new Configuration() { + { + set("fs.defaultFS", defaultBaseLocation()); + } + }); + Assertions.assertThrows( + Exception.class, + () -> + userFileSystem.listFiles(new Path(storageLocation(filenameRole)), false)); + Assertions.assertThrows( + Exception.class, + () -> + userFileSystem.mkdirs( + new Path( + String.format("%s/%s", storageLocation(filenameRole), "test4")))); + userFileSystem.close(); + return null; + }); + + catalog.asFilesetCatalog().dropFileset(NameIdentifier.of(schemaName, fileset.name())); + } + + private void createCatalogAndSchema() { + GravitinoMetalake[] gravitinoMetalakes = client.listMetalakes(); + Assertions.assertEquals(0, gravitinoMetalakes.length); + + client.createMetalake(metalakeName, "comment", Collections.emptyMap()); + metalake = client.loadMetalake(metalakeName); + Assertions.assertEquals(metalakeName, metalake.name()); + + metalake.createCatalog( + catalogName, + Catalog.Type.FILESET, + provider, + "comment", + ImmutableMap.of( + IMPERSONATION_ENABLE, + "true", + AUTHORIZATION_PROVIDER, + "ranger", + RANGER_SERVICE_NAME, + RangerITEnv.RANGER_HDFS_REPO_NAME, + AuthorizationPropertiesMeta.RANGER_ADMIN_URL, + RANGER_ADMIN_URL, + RANGER_AUTH_TYPE, + RangerContainer.authType, + RANGER_USERNAME, + RangerContainer.rangerUserName, + RANGER_PASSWORD, + RangerContainer.rangerPassword)); + + catalog = metalake.loadCatalog(catalogName); + catalog + .asSchemas() + .createSchema(schemaName, "comment", ImmutableMap.of("location", defaultBaseLocation())); + Schema loadSchema = catalog.asSchemas().loadSchema(schemaName); + Assertions.assertEquals(schemaName, loadSchema.name()); + Assertions.assertNotNull(loadSchema.properties().get("location")); + } + + private String defaultBaseLocation() { + if (defaultBaseLocation == null) { + defaultBaseLocation = + String.format( + "hdfs://%s:%d/user/hadoop/%s", + containerSuite.getHiveRangerContainer().getContainerIpAddress(), + HiveContainer.HDFS_DEFAULTFS_PORT, + schemaName.toLowerCase()); + } + return defaultBaseLocation; + } + + private String storageLocation(String filesetName) { + return defaultBaseLocation() + "/" + filesetName; + } +} 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 cb41e7921..600463fbc 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 @@ -67,7 +67,7 @@ public class RangerHiveE2EIT extends RangerBaseE2EIT { registerCustomConfigs(configs); super.startIntegrationTest(); - RangerITEnv.init(); + RangerITEnv.init(true); RangerITEnv.startHiveRangerContainer(); RANGER_ADMIN_URL = 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 dce93a614..9c45a2109 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 @@ -48,10 +48,10 @@ 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.RangerHadoopSQLMetadataObject; +import org.apache.gravitino.authorization.ranger.RangerHadoopSQLSecurableObject; import org.apache.gravitino.authorization.ranger.RangerHelper; -import org.apache.gravitino.authorization.ranger.RangerMetadataObject; import org.apache.gravitino.authorization.ranger.RangerPrivileges; -import org.apache.gravitino.authorization.ranger.RangerSecurableObject; import org.apache.gravitino.authorization.ranger.reference.RangerDefines; import org.apache.gravitino.integration.test.util.GravitinoITUtils; import org.apache.gravitino.meta.AuditInfo; @@ -80,7 +80,7 @@ public class RangerHiveIT { @BeforeAll public static void setup() { - RangerITEnv.init(); + RangerITEnv.init(true); rangerAuthHivePlugin = RangerITEnv.rangerAuthHivePlugin; rangerHelper = RangerITEnv.rangerHelper; @@ -343,7 +343,7 @@ public class RangerHiveIT { AuthorizationSecurableObject rangerSecurableObject = rangerAuthHivePlugin.generateAuthorizationSecurableObject( ImmutableList.of(String.format("%s3", dbName), "tab1"), - RangerMetadataObject.Type.TABLE, + RangerHadoopSQLMetadataObject.Type.TABLE, ImmutableSet.of( new RangerPrivileges.RangerHivePrivilegeImpl( RangerPrivileges.RangerHadoopSQLPrivilege.ALL, Privilege.Condition.ALLOW))); @@ -460,7 +460,7 @@ public class RangerHiveIT { Collections.singletonList(policyItem)); } - static boolean deleteHivePolicy(RangerSecurableObject rangerSecurableObject) { + static boolean deleteHivePolicy(RangerHadoopSQLSecurableObject rangerSecurableObject) { RangerPolicy policy = rangerHelper.findManagedPolicy(rangerSecurableObject); if (policy != null) { try { 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 2758d307b..f6b83bb9d 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 @@ -18,6 +18,8 @@ */ package org.apache.gravitino.authorization.ranger.integration.test; +import static org.mockito.Mockito.doReturn; + import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import java.util.Arrays; @@ -30,6 +32,7 @@ import java.util.stream.Collectors; import org.apache.gravitino.authorization.AuthorizationSecurableObject; import org.apache.gravitino.authorization.Privilege; import org.apache.gravitino.authorization.Role; +import org.apache.gravitino.authorization.ranger.RangerAuthorizationHDFSPlugin; import org.apache.gravitino.authorization.ranger.RangerAuthorizationHadoopSQLPlugin; import org.apache.gravitino.authorization.ranger.RangerAuthorizationPlugin; import org.apache.gravitino.authorization.ranger.RangerHelper; @@ -47,6 +50,7 @@ import org.apache.ranger.plugin.model.RangerRole; import org.apache.ranger.plugin.model.RangerService; import org.apache.ranger.plugin.util.SearchFilter; import org.junit.jupiter.api.Assertions; +import org.mockito.Mockito; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -81,9 +85,12 @@ public class RangerITEnv { // 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; protected static RangerHelper rangerHelper; - public static void init() { + protected static RangerHelper rangerHDFSHelper; + + public static void init(boolean allowAnyoneAccessHDFS) { containerSuite.startRangerContainer(); rangerClient = containerSuite.getRangerContainer().rangerClient; @@ -104,6 +111,28 @@ public class RangerITEnv { RangerContainer.rangerPassword, AuthorizationPropertiesMeta.RANGER_SERVICE_NAME, RangerITEnv.RANGER_HIVE_REPO_NAME)); + + RangerAuthorizationHDFSPlugin spyRangerAuthorizationHDFSPlugin = + Mockito.spy( + RangerAuthorizationHDFSPlugin.getInstance( + "metalake", + ImmutableMap.of( + AuthorizationPropertiesMeta.RANGER_ADMIN_URL, + String.format( + "http://%s:%d", + containerSuite.getRangerContainer().getContainerIpAddress(), + RangerContainer.RANGER_SERVER_PORT), + AuthorizationPropertiesMeta.RANGER_AUTH_TYPE, + RangerContainer.authType, + AuthorizationPropertiesMeta.RANGER_USERNAME, + RangerContainer.rangerUserName, + AuthorizationPropertiesMeta.RANGER_PASSWORD, + RangerContainer.rangerPassword, + AuthorizationPropertiesMeta.RANGER_SERVICE_NAME, + RangerITEnv.RANGER_HDFS_REPO_NAME))); + doReturn("/test").when(spyRangerAuthorizationHDFSPlugin).getFileSetPath(Mockito.any()); + rangerAuthHDFSPlugin = spyRangerAuthorizationHDFSPlugin; + rangerHelper = new RangerHelper( rangerClient, @@ -112,12 +141,22 @@ public class RangerITEnv { rangerAuthHivePlugin.ownerMappingRule(), rangerAuthHivePlugin.policyResourceDefinesRule()); + rangerHDFSHelper = + new RangerHelper( + rangerClient, + RangerContainer.rangerUserName, + RangerITEnv.RANGER_HDFS_REPO_NAME, + rangerAuthHDFSPlugin.ownerMappingRule(), + rangerAuthHDFSPlugin.policyResourceDefinesRule()); + if (!initRangerService) { synchronized (RangerITEnv.class) { // No IP address set, no impact on testing createRangerHdfsRepository("", true); createRangerHiveRepository("", true); - allowAnyoneAccessHDFS(); + if (allowAnyoneAccessHDFS) { + allowAnyoneAccessHDFS(); + } initRangerService = true; } } diff --git a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerIcebergE2EIT.java b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerIcebergE2EIT.java index 7b45eda7a..a4fc1253e 100644 --- a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerIcebergE2EIT.java +++ b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerIcebergE2EIT.java @@ -71,7 +71,7 @@ public class RangerIcebergE2EIT extends RangerBaseE2EIT { registerCustomConfigs(configs); super.startIntegrationTest(); - RangerITEnv.init(); + RangerITEnv.init(true); RangerITEnv.startHiveRangerContainer(); RANGER_ADMIN_URL = diff --git a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerPaimonE2EIT.java b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerPaimonE2EIT.java index 7cb600b9d..b2529837e 100644 --- a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerPaimonE2EIT.java +++ b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerPaimonE2EIT.java @@ -70,7 +70,7 @@ public class RangerPaimonE2EIT extends RangerBaseE2EIT { registerCustomConfigs(configs); super.startIntegrationTest(); - RangerITEnv.init(); + RangerITEnv.init(true); RangerITEnv.startHiveRangerContainer(); RANGER_ADMIN_URL =