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 b953226ab [#5665] refactor(auth): Underlying datasource authorization
privilege abstraction (#5674)
b953226ab is described below
commit b953226ab5fc5d15bcb2c075f1e292139f62e50c
Author: Xun <[email protected]>
AuthorDate: Wed Nov 27 20:49:02 2024 +0800
[#5665] refactor(auth): Underlying datasource authorization privilege
abstraction (#5674)
### What changes were proposed in this pull request?
1. abstract AuthorizationMetadataObject interface
2. abstract AuthorizationPrivilege interface
3. abstract AuthorizationSecurableObject interface
4. abstract AuthorizationPrivilegesMappingProvider interface
### Why are the changes needed?
Fix: #5665
### Does this PR introduce _any_ user-facing change?
N/A
### How was this patch tested?
CI Passed.
---
.../ranger/RangerAuthorizationHadoopSQLPlugin.java | 140 ++++++-------
.../ranger/RangerAuthorizationPlugin.java | 229 ++++++++++++---------
.../authorization/ranger/RangerHelper.java | 25 ++-
.../authorization/ranger/RangerMetadataObject.java | 138 ++++++++-----
.../ranger/RangerMetadataObjects.java | 125 -----------
.../authorization/ranger/RangerPrivileges.java | 23 ++-
.../ranger/RangerPrivilegesMappingProvider.java | 92 ---------
.../ranger/RangerSecurableObject.java | 43 ++--
.../ranger/RangerSecurableObjects.java | 55 -----
.../test/RangerAuthorizationPluginIT.java | 29 +--
.../ranger/integration/test/RangerHiveIT.java | 21 +-
.../ranger/integration/test/RangerITEnv.java | 4 +-
.../authorization/AuthorizationMetadataObject.java | 79 +++----
.../authorization/AuthorizationPrivilege.java | 8 +-
.../AuthorizationPrivilegesMappingProvider.java | 83 ++++++++
.../AuthorizationSecurableObject.java | 21 +-
16 files changed, 504 insertions(+), 611 deletions(-)
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 9ad2a8c1e..d403d4469 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
@@ -32,6 +32,9 @@ import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.gravitino.MetadataObject;
+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;
@@ -62,38 +65,9 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
return instance;
}
- /** Validate different Ranger metadata object */
- @Override
- public void validateRangerMetadataObject(List<String> names,
RangerMetadataObject.Type type)
- throws IllegalArgumentException {
- 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");
- 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");
-
- for (String name : names) {
- RangerMetadataObjects.checkName(name);
- }
- }
-
@Override
/** Set the default mapping Gravitino privilege name to the Ranger rule */
- public Map<Privilege.Name, Set<RangerPrivilege>> privilegesMappingRule() {
+ public Map<Privilege.Name, Set<AuthorizationPrivilege>>
privilegesMappingRule() {
return ImmutableMap.of(
Privilege.Name.CREATE_CATALOG,
ImmutableSet.of(RangerHadoopSQLPrivilege.CREATE),
@@ -116,7 +90,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
@Override
/** Set the default owner rule. */
- public Set<RangerPrivilege> ownerMappingRule() {
+ public Set<AuthorizationPrivilege> ownerMappingRule() {
return ImmutableSet.of(RangerHadoopSQLPrivilege.ALL);
}
@@ -145,7 +119,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
/**
* Allow Gravitino MetadataObject type defines rule.
*
- * @return The allow Gravitino MetadataObject type defines rule.
+ * @return To allow Gravitino MetadataObject type defines rule.
*/
@Override
public Set<MetadataObject.Type> allowMetadataObjectTypesRule() {
@@ -159,27 +133,27 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
/** Translate the Gravitino securable object to the Ranger owner securable
object. */
@Override
- public List<RangerSecurableObject> translateOwner(MetadataObject
gravitinoMetadataObject) {
- List<RangerSecurableObject> rangerSecurableObjects = new ArrayList<>();
+ public List<AuthorizationSecurableObject> translateOwner(MetadataObject
gravitinoMetadataObject) {
+ List<AuthorizationSecurableObject> AuthorizationSecurableObjects = new
ArrayList<>();
switch (gravitinoMetadataObject.type()) {
case METALAKE:
case CATALOG:
// Add `*` for the SCHEMA permission
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
ImmutableList.of(RangerHelper.RESOURCE_ALL),
RangerMetadataObject.Type.SCHEMA,
ownerMappingRule()));
// Add `*.*` for the TABLE permission
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
ImmutableList.of(RangerHelper.RESOURCE_ALL,
RangerHelper.RESOURCE_ALL),
RangerMetadataObject.Type.TABLE,
ownerMappingRule()));
// Add `*.*.*` for the COLUMN permission
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
ImmutableList.of(
RangerHelper.RESOURCE_ALL,
RangerHelper.RESOURCE_ALL,
@@ -189,21 +163,21 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
break;
case SCHEMA:
// Add `{schema}` for the SCHEMA permission
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
ImmutableList.of(gravitinoMetadataObject.name() /*Schema
name*/),
RangerMetadataObject.Type.SCHEMA,
ownerMappingRule()));
// Add `{schema}.*` for the TABLE permission
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
ImmutableList.of(
gravitinoMetadataObject.name() /*Schema name*/,
RangerHelper.RESOURCE_ALL),
RangerMetadataObject.Type.TABLE,
ownerMappingRule()));
// Add `{schema}.*.*` for the COLUMN permission
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
ImmutableList.of(
gravitinoMetadataObject.name() /*Schema name*/,
RangerHelper.RESOURCE_ALL,
@@ -213,14 +187,14 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
break;
case TABLE:
// Add `{schema}.{table}` for the TABLE permission
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
translateMetadataObject(gravitinoMetadataObject).names(),
RangerMetadataObject.Type.TABLE,
ownerMappingRule()));
// Add `{schema}.{table}.*` for the COLUMN permission
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
Stream.concat(
translateMetadataObject(gravitinoMetadataObject).names().stream(),
Stream.of(RangerHelper.RESOURCE_ALL))
@@ -234,19 +208,19 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
gravitinoMetadataObject.type());
}
- return rangerSecurableObjects;
+ return AuthorizationSecurableObjects;
}
/** Translate the Gravitino securable object to the Ranger securable object.
*/
@Override
- public List<RangerSecurableObject> translatePrivilege(SecurableObject
securableObject) {
- List<RangerSecurableObject> rangerSecurableObjects = new ArrayList<>();
+ public List<AuthorizationSecurableObject> translatePrivilege(SecurableObject
securableObject) {
+ List<AuthorizationSecurableObject> AuthorizationSecurableObjects = new
ArrayList<>();
securableObject.privileges().stream()
.filter(Objects::nonNull)
.forEach(
gravitinoPrivilege -> {
- Set<RangerPrivilege> rangerPrivileges = new HashSet<>();
+ Set<AuthorizationPrivilege> rangerPrivileges = new HashSet<>();
// Ignore unsupported privileges
if
(!privilegesMappingRule().containsKey(gravitinoPrivilege.name())) {
return;
@@ -268,8 +242,8 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
case METALAKE:
case CATALOG:
// Add Ranger privilege(`SELECT`) to SCHEMA(`*`)
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
ImmutableList.of(RangerHelper.RESOURCE_ALL),
RangerMetadataObject.Type.SCHEMA,
rangerPrivileges));
@@ -285,8 +259,8 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
case METALAKE:
case CATALOG:
// Add Ranger privilege(`CREATE`) to SCHEMA(`*`)
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
ImmutableList.of(RangerHelper.RESOURCE_ALL),
RangerMetadataObject.Type.SCHEMA,
rangerPrivileges));
@@ -302,16 +276,16 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
case METALAKE:
case CATALOG:
// Add Ranger privilege(`SELECT`) to SCHEMA(`*`)
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
ImmutableList.of(RangerHelper.RESOURCE_ALL),
RangerMetadataObject.Type.SCHEMA,
rangerPrivileges));
break;
case SCHEMA:
// Add Ranger privilege(`SELECT`) to SCHEMA(`{schema}`)
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
ImmutableList.of(securableObject.name() /*Schema
name*/),
RangerMetadataObject.Type.SCHEMA,
rangerPrivileges));
@@ -329,15 +303,15 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
case METALAKE:
case CATALOG:
// Add `*.*` for the TABLE permission
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
ImmutableList.of(
RangerHelper.RESOURCE_ALL,
RangerHelper.RESOURCE_ALL),
RangerMetadataObject.Type.TABLE,
rangerPrivileges));
// Add `*.*.*` for the COLUMN permission
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
ImmutableList.of(
RangerHelper.RESOURCE_ALL,
RangerHelper.RESOURCE_ALL,
@@ -347,16 +321,16 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
break;
case SCHEMA:
// Add `{schema}.*` for the TABLE permission
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
ImmutableList.of(
securableObject.name() /*Schema name*/,
RangerHelper.RESOURCE_ALL),
RangerMetadataObject.Type.TABLE,
rangerPrivileges));
// Add `{schema}.*.*` for the COLUMN permission
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
ImmutableList.of(
securableObject.name() /*Schema name*/,
RangerHelper.RESOURCE_ALL,
@@ -371,14 +345,14 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
gravitinoPrivilege.name(), securableObject.type());
} else {
// Add `{schema}.{table}` for the TABLE permission
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
translateMetadataObject(securableObject).names(),
RangerMetadataObject.Type.TABLE,
rangerPrivileges));
// Add `{schema}.{table}.*` for the COLUMN permission
- rangerSecurableObjects.add(
- generateRangerSecurableObject(
+ AuthorizationSecurableObjects.add(
+ generateAuthorizationSecurableObject(
Stream.concat(
translateMetadataObject(securableObject).names().stream(),
Stream.of(RangerHelper.RESOURCE_ALL))
@@ -402,7 +376,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
}
});
- return rangerSecurableObjects;
+ return AuthorizationSecurableObjects;
}
/**
@@ -410,7 +384,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
* convert the Gravitino metadata object to the Ranger metadata object.
*/
@Override
- public RangerMetadataObject translateMetadataObject(MetadataObject
metadataObject) {
+ public AuthorizationMetadataObject translateMetadataObject(MetadataObject
metadataObject) {
Preconditions.checkArgument(
allowMetadataObjectTypesRule().contains(metadataObject.type()),
String.format(
@@ -424,7 +398,7 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
Preconditions.checkArgument(
nsMetadataObject.size() > 0, "The metadata object must have at least
one name.");
- RangerMetadataObject.Type type;
+ AuthorizationMetadataObject.Type type;
if (metadataObject.type() == MetadataObject.Type.METALAKE
|| metadataObject.type() == MetadataObject.Type.CATALOG) {
nsMetadataObject.clear();
@@ -435,10 +409,12 @@ public class RangerAuthorizationHadoopSQLPlugin extends
RangerAuthorizationPlugi
type = RangerMetadataObject.Type.fromMetadataType(metadataObject.type());
}
- validateRangerMetadataObject(nsMetadataObject, type);
- return new RangerMetadataObjects.RangerMetadataObjectImpl(
- RangerMetadataObjects.getParentFullName(nsMetadataObject),
- RangerMetadataObjects.getLastName(nsMetadataObject),
- type);
+ RangerMetadataObject rangerMetadataObject =
+ new RangerMetadataObject(
+ AuthorizationMetadataObject.getParentFullName(nsMetadataObject),
+ AuthorizationMetadataObject.getLastName(nsMetadataObject),
+ type);
+ rangerMetadataObject.validateAuthorizationMetadataObject();
+ return rangerMetadataObject;
}
}
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 1b2c924d2..b522691cb 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
@@ -18,9 +18,6 @@
*/
package org.apache.gravitino.authorization.ranger;
-import static
org.apache.gravitino.authorization.ranger.RangerMetadataObjects.DOT_JOINER;
-import static
org.apache.gravitino.authorization.ranger.RangerMetadataObjects.DOT_SPLITTER;
-
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
@@ -39,6 +36,10 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.gravitino.MetadataObject;
+import org.apache.gravitino.authorization.AuthorizationMetadataObject;
+import org.apache.gravitino.authorization.AuthorizationPrivilege;
+import
org.apache.gravitino.authorization.AuthorizationPrivilegesMappingProvider;
+import org.apache.gravitino.authorization.AuthorizationSecurableObject;
import org.apache.gravitino.authorization.Group;
import org.apache.gravitino.authorization.MetadataObjectChange;
import org.apache.gravitino.authorization.Owner;
@@ -76,7 +77,7 @@ import org.slf4j.LoggerFactory;
* implement Gravitino Owner concept. <br>
*/
public abstract class RangerAuthorizationPlugin
- implements AuthorizationPlugin, RangerPrivilegesMappingProvider,
RangerMetadataObjectRule {
+ implements AuthorizationPlugin, AuthorizationPrivilegesMappingProvider {
private static final Logger LOG =
LoggerFactory.getLogger(RangerAuthorizationPlugin.class);
protected final String rangerServiceName;
@@ -107,6 +108,13 @@ public abstract class RangerAuthorizationPlugin
policyResourceDefinesRule());
}
+ /**
+ * Set the Ranger policy resource defines rule.
+ *
+ * @return The policy resource defines rule.
+ */
+ public abstract List<String> policyResourceDefinesRule();
+
/**
* Create a new role in the Ranger. <br>
* 1. Create a policy for metadata object. <br>
@@ -168,11 +176,12 @@ public abstract class RangerAuthorizationPlugin
return false;
}
- List<RangerSecurableObject> rangerSecurableObjects =
translatePrivilege(securableObject);
- rangerSecurableObjects.stream()
+ List<AuthorizationSecurableObject> AuthorizationSecurableObjects =
+ translatePrivilege(securableObject);
+ AuthorizationSecurableObjects.stream()
.forEach(
- rangerSecurableObject -> {
- if (!doAddSecurableObject(role.name(),
rangerSecurableObject)) {
+ AuthorizationSecurableObject -> {
+ if (!doAddSecurableObject(role.name(),
AuthorizationSecurableObject)) {
throw new AuthorizationPluginException(
"Failed to add the securable object to the Ranger
policy!");
}
@@ -184,11 +193,12 @@ public abstract class RangerAuthorizationPlugin
return false;
}
- List<RangerSecurableObject> rangerSecurableObjects =
translatePrivilege(securableObject);
- rangerSecurableObjects.stream()
+ List<AuthorizationSecurableObject> AuthorizationSecurableObjects =
+ translatePrivilege(securableObject);
+ AuthorizationSecurableObjects.stream()
.forEach(
- rangerSecurableObject -> {
- if (!doRemoveSecurableObject(role.name(),
rangerSecurableObject)) {
+ AuthorizationSecurableObject -> {
+ if (!doRemoveSecurableObject(role.name(),
AuthorizationSecurableObject)) {
throw new AuthorizationPluginException(
"Failed to add the securable object to the Ranger
policy!");
}
@@ -209,19 +219,19 @@ public abstract class RangerAuthorizationPlugin
(oldSecurableObject.fullName().equals(newSecurableObject.fullName())
&&
oldSecurableObject.type().equals(newSecurableObject.type())),
"The old and new securable objects metadata must be equal!");
- List<RangerSecurableObject> rangerOldSecurableObjects =
+ List<AuthorizationSecurableObject> rangerOldSecurableObjects =
translatePrivilege(oldSecurableObject);
- List<RangerSecurableObject> rangerNewSecurableObjects =
+ List<AuthorizationSecurableObject> rangerNewSecurableObjects =
translatePrivilege(newSecurableObject);
rangerOldSecurableObjects.stream()
.forEach(
- rangerSecurableObject -> {
- doRemoveSecurableObject(role.name(), rangerSecurableObject);
+ AuthorizationSecurableObject -> {
+ doRemoveSecurableObject(role.name(),
AuthorizationSecurableObject);
});
rangerNewSecurableObjects.stream()
.forEach(
- rangerSecurableObject -> {
- doAddSecurableObject(role.name(), rangerSecurableObject);
+ AuthorizationSecurableObject -> {
+ doAddSecurableObject(role.name(),
AuthorizationSecurableObject);
});
} else {
throw new IllegalArgumentException(
@@ -241,21 +251,24 @@ public abstract class RangerAuthorizationPlugin
((MetadataObjectChange.RenameMetadataObject)
change).metadataObject();
MetadataObject newMetadataObject =
((MetadataObjectChange.RenameMetadataObject)
change).newMetadataObject();
- RangerMetadataObject rangerMetadataObject =
translateMetadataObject(metadataObject);
- RangerMetadataObject newRangerMetadataObject =
translateMetadataObject(newMetadataObject);
- if (rangerMetadataObject.equals(newRangerMetadataObject)) {
+ AuthorizationMetadataObject AuthorizationMetadataObject =
+ translateMetadataObject(metadataObject);
+ AuthorizationMetadataObject newAuthorizationMetadataObject =
+ translateMetadataObject(newMetadataObject);
+ if
(AuthorizationMetadataObject.equals(newAuthorizationMetadataObject)) {
LOG.info(
"The metadata object({}) and new metadata object({}) are equal,
so ignore rename!",
- rangerMetadataObject.fullName(),
- newRangerMetadataObject.fullName());
+ AuthorizationMetadataObject.fullName(),
+ newAuthorizationMetadataObject.fullName());
continue;
}
- doRenameMetadataObject(rangerMetadataObject, newRangerMetadataObject);
+ doRenameMetadataObject(AuthorizationMetadataObject,
newAuthorizationMetadataObject);
} else if (change instanceof MetadataObjectChange.RemoveMetadataObject) {
MetadataObject metadataObject =
((MetadataObjectChange.RemoveMetadataObject)
change).metadataObject();
- RangerMetadataObject rangerMetadataObject =
translateMetadataObject(metadataObject);
- doRemoveMetadataObject(rangerMetadataObject);
+ AuthorizationMetadataObject AuthorizationMetadataObject =
+ translateMetadataObject(metadataObject);
+ doRemoveMetadataObject(AuthorizationMetadataObject);
} else {
throw new IllegalArgumentException(
"Unsupported metadata object change type: "
@@ -322,7 +335,8 @@ public abstract class RangerAuthorizationPlugin
onGroupAdded(groupEntity);
}
- List<RangerSecurableObject> rangerSecurableObjects =
translateOwner(metadataObject);
+ List<AuthorizationSecurableObject> AuthorizationSecurableObjects =
+ translateOwner(metadataObject);
String ownerRoleName;
switch (metadataObject.type()) {
case METALAKE:
@@ -353,15 +367,16 @@ public abstract class RangerAuthorizationPlugin
LOG.warn("Grant owner role: {} failed!", ownerRoleName, e);
}
- rangerSecurableObjects.stream()
+ AuthorizationSecurableObjects.stream()
.forEach(
- rangerSecurableObject -> {
- RangerPolicy policy =
rangerHelper.findManagedPolicy(rangerSecurableObject);
+ AuthorizationSecurableObject -> {
+ RangerPolicy policy =
+
rangerHelper.findManagedPolicy(AuthorizationSecurableObject);
try {
if (policy == null) {
policy =
rangerHelper.addOwnerRoleToNewPolicy(
- rangerSecurableObject, ownerRoleName);
+ AuthorizationSecurableObject, ownerRoleName);
rangerClient.createPolicy(policy);
} else {
rangerHelper.updatePolicyOwnerRole(policy,
ownerRoleName);
@@ -376,13 +391,15 @@ public abstract class RangerAuthorizationPlugin
case SCHEMA:
case TABLE:
// The schema and table use user/group to manage the owner
- rangerSecurableObjects.stream()
+ AuthorizationSecurableObjects.stream()
.forEach(
- rangerSecurableObject -> {
- RangerPolicy policy =
rangerHelper.findManagedPolicy(rangerSecurableObject);
+ AuthorizationSecurableObject -> {
+ RangerPolicy policy =
+
rangerHelper.findManagedPolicy(AuthorizationSecurableObject);
try {
if (policy == null) {
- policy =
rangerHelper.addOwnerToNewPolicy(rangerSecurableObject, newOwner);
+ policy =
+
rangerHelper.addOwnerToNewPolicy(AuthorizationSecurableObject, newOwner);
rangerClient.createPolicy(policy);
} else {
rangerHelper.updatePolicyOwner(policy, preOwner,
newOwner);
@@ -607,20 +624,21 @@ public abstract class RangerAuthorizationPlugin
* return true. <br>
* 3. If the policy does not exist, then create a new policy. <br>
*/
- private boolean doAddSecurableObject(String roleName, RangerSecurableObject
securableObject) {
+ private boolean doAddSecurableObject(
+ String roleName, AuthorizationSecurableObject securableObject) {
RangerPolicy policy = rangerHelper.findManagedPolicy(securableObject);
if (policy != null) {
// Check the policy item's accesses and roles equal the Ranger securable
object's privilege
- List<RangerPrivilege> allowPrivilies =
+ List<AuthorizationPrivilege> allowPrivilies =
securableObject.privileges().stream()
.filter(privilege -> privilege.condition() ==
Privilege.Condition.ALLOW)
.collect(Collectors.toList());
- List<RangerPrivilege> denyPrivilies =
+ List<AuthorizationPrivilege> denyPrivilies =
securableObject.privileges().stream()
.filter(privilege -> privilege.condition() ==
Privilege.Condition.DENY)
.collect(Collectors.toList());
- Set<RangerPrivilege> policyPrivileges =
+ Set<AuthorizationPrivilege> policyPrivileges =
policy.getPolicyItems().stream()
.filter(
policyItem ->
@@ -632,7 +650,7 @@ public abstract class RangerAuthorizationPlugin
.map(RangerPrivileges::valueOf)
.collect(Collectors.toSet());
- Set<RangerPrivilege> policyDenyPrivileges =
+ Set<AuthorizationPrivilege> policyDenyPrivileges =
policy.getDenyPolicyItems().stream()
.filter(
policyItem ->
@@ -681,17 +699,17 @@ public abstract class RangerAuthorizationPlugin
* 3. If policy does not contain any policy item, then delete this policy.
<br>
*/
private boolean doRemoveSecurableObject(
- String roleName, RangerSecurableObject rangerSecurableObject) {
- RangerPolicy policy =
rangerHelper.findManagedPolicy(rangerSecurableObject);
+ String roleName, AuthorizationSecurableObject
AuthorizationSecurableObject) {
+ RangerPolicy policy =
rangerHelper.findManagedPolicy(AuthorizationSecurableObject);
if (policy == null) {
LOG.warn(
"Cannot find the Ranger policy for the Ranger securable object({})!",
- rangerSecurableObject.fullName());
+ AuthorizationSecurableObject.fullName());
// Don't throw exception or return false, because need support immutable
operation.
return true;
}
- rangerSecurableObject.privileges().stream()
+ AuthorizationSecurableObject.privileges().stream()
.forEach(
rangerPrivilege -> {
if (rangerPrivilege.condition() == Privilege.Condition.ALLOW) {
@@ -700,7 +718,7 @@ public abstract class RangerAuthorizationPlugin
.forEach(
policyItem -> {
removePolicyItemIfEqualRoleName(
- policyItem, rangerSecurableObject, roleName);
+ policyItem, AuthorizationSecurableObject,
roleName);
});
} else {
policy
@@ -708,7 +726,7 @@ public abstract class RangerAuthorizationPlugin
.forEach(
policyItem -> {
removePolicyItemIfEqualRoleName(
- policyItem, rangerSecurableObject, roleName);
+ policyItem, AuthorizationSecurableObject,
roleName);
});
}
});
@@ -741,7 +759,7 @@ public abstract class RangerAuthorizationPlugin
private void removePolicyItemIfEqualRoleName(
RangerPolicy.RangerPolicyItem policyItem,
- RangerSecurableObject rangerSecurableObject,
+ AuthorizationSecurableObject AuthorizationSecurableObject,
String roleName) {
roleName = rangerHelper.generateGravitinoRoleName(roleName);
boolean match =
@@ -751,7 +769,7 @@ public abstract class RangerAuthorizationPlugin
access -> {
// Use Gravitino privilege to search the Ranger policy
item's access
boolean matchPrivilege =
- rangerSecurableObject.privileges().stream()
+ AuthorizationSecurableObject.privileges().stream()
.anyMatch(privilege ->
privilege.equalsTo(access.getType()));
return matchPrivilege;
});
@@ -767,20 +785,20 @@ public abstract class RangerAuthorizationPlugin
* <br>
* IF remove the COLUMN, Only need to remove `{schema}.*.*` <br>
*/
- private void doRemoveMetadataObject(RangerMetadataObject
rangerMetadataObject) {
- switch (rangerMetadataObject.type()) {
+ private void doRemoveMetadataObject(AuthorizationMetadataObject
authMetadataObject) {
+ switch (authMetadataObject.metadataObjectType()) {
case SCHEMA:
- doRemoveSchemaMetadataObject(rangerMetadataObject);
+ doRemoveSchemaMetadataObject(authMetadataObject);
break;
case TABLE:
- doRemoveTableMetadataObject(rangerMetadataObject);
+ doRemoveTableMetadataObject(authMetadataObject);
break;
case COLUMN:
- removePolicyByMetadataObject(rangerMetadataObject.names());
+ removePolicyByMetadataObject(authMetadataObject.names());
break;
default:
throw new IllegalArgumentException(
- "Unsupported metadata object type: " +
rangerMetadataObject.type());
+ "Unsupported metadata object type: " + authMetadataObject.type());
}
}
@@ -788,13 +806,13 @@ public abstract class RangerAuthorizationPlugin
* Remove the SCHEMA, Need to remove these the relevant policies,
`{schema}`, `{schema}.*`,
* `{schema}.*.*` permissions.
*/
- private void doRemoveSchemaMetadataObject(RangerMetadataObject
rangerMetadataObject) {
+ private void doRemoveSchemaMetadataObject(AuthorizationMetadataObject
authMetadataObject) {
Preconditions.checkArgument(
- rangerMetadataObject.type() == RangerMetadataObject.Type.SCHEMA,
+ authMetadataObject.type() == RangerMetadataObject.Type.SCHEMA,
"The metadata object type must be SCHEMA");
Preconditions.checkArgument(
- rangerMetadataObject.names().size() == 1, "The metadata object names
must be 1");
- if (RangerHelper.RESOURCE_ALL.equals(rangerMetadataObject.name())) {
+ authMetadataObject.names().size() == 1, "The metadata object names
must be 1");
+ if (RangerHelper.RESOURCE_ALL.equals(authMetadataObject.name())) {
// Delete metalake or catalog policies in this Ranger service
try {
List<RangerPolicy> policies =
rangerClient.getPoliciesInService(rangerServiceName);
@@ -807,14 +825,14 @@ public abstract class RangerAuthorizationPlugin
} else {
List<List<String>> loop =
ImmutableList.of(
- ImmutableList.of(rangerMetadataObject.name())
+ ImmutableList.of(authMetadataObject.name())
/** SCHEMA permission */
,
- ImmutableList.of(rangerMetadataObject.name(),
RangerHelper.RESOURCE_ALL)
+ ImmutableList.of(authMetadataObject.name(),
RangerHelper.RESOURCE_ALL)
/** TABLE permission */
,
ImmutableList.of(
- rangerMetadataObject.name(), RangerHelper.RESOURCE_ALL,
RangerHelper.RESOURCE_ALL)
+ authMetadataObject.name(), RangerHelper.RESOURCE_ALL,
RangerHelper.RESOURCE_ALL)
/** COLUMN permission */
);
for (List<String> resNames : loop) {
@@ -827,14 +845,16 @@ public abstract class RangerAuthorizationPlugin
* Remove the TABLE, Need to remove these the relevant policies,
`*.{table}`, `*.{table}.{column}`
* permissions.
*/
- private void doRemoveTableMetadataObject(RangerMetadataObject
rangerMetadataObject) {
+ private void doRemoveTableMetadataObject(
+ AuthorizationMetadataObject AuthorizationMetadataObject) {
List<List<String>> loop =
ImmutableList.of(
- rangerMetadataObject.names()
+ AuthorizationMetadataObject.names()
/** TABLE permission */
,
Stream.concat(
- rangerMetadataObject.names().stream(),
Stream.of(RangerHelper.RESOURCE_ALL))
+ AuthorizationMetadataObject.names().stream(),
+ Stream.of(RangerHelper.RESOURCE_ALL))
.collect(Collectors.toList())
/** COLUMN permission */
);
@@ -851,20 +871,21 @@ public abstract class RangerAuthorizationPlugin
* IF rename the COLUMN, Only need to rename `{schema}.*.*` <br>
*/
private void doRenameMetadataObject(
- RangerMetadataObject rangerMetadataObject, RangerMetadataObject
newRangerMetadataObject) {
- switch (rangerMetadataObject.type()) {
+ AuthorizationMetadataObject AuthorizationMetadataObject,
+ AuthorizationMetadataObject newAuthMetadataObject) {
+ switch (newAuthMetadataObject.metadataObjectType()) {
case SCHEMA:
- doRenameSchemaMetadataObject(rangerMetadataObject,
newRangerMetadataObject);
+ doRenameSchemaMetadataObject(AuthorizationMetadataObject,
newAuthMetadataObject);
break;
case TABLE:
- doRenameTableMetadataObject(rangerMetadataObject,
newRangerMetadataObject);
+ doRenameTableMetadataObject(AuthorizationMetadataObject,
newAuthMetadataObject);
break;
case COLUMN:
- doRenameColumnMetadataObject(rangerMetadataObject,
newRangerMetadataObject);
+ doRenameColumnMetadataObject(AuthorizationMetadataObject,
newAuthMetadataObject);
break;
default:
throw new IllegalArgumentException(
- "Unsupported metadata object type: " +
rangerMetadataObject.type());
+ "Unsupported metadata object type: " +
AuthorizationMetadataObject.type());
}
}
@@ -873,13 +894,15 @@ public abstract class RangerAuthorizationPlugin
* `{schema}.*.*` <br>
*/
private void doRenameSchemaMetadataObject(
- RangerMetadataObject rangerMetadataObject, RangerMetadataObject
newRangerMetadataObject) {
+ AuthorizationMetadataObject AuthorizationMetadataObject,
+ AuthorizationMetadataObject newAuthorizationMetadataObject) {
List<String> oldMetadataNames = new ArrayList<>();
List<String> newMetadataNames = new ArrayList<>();
List<Map<String, String>> loop =
ImmutableList.of(
ImmutableMap.of(
- rangerMetadataObject.names().get(0),
newRangerMetadataObject.names().get(0)),
+ AuthorizationMetadataObject.names().get(0),
+ newAuthorizationMetadataObject.names().get(0)),
ImmutableMap.of(RangerHelper.RESOURCE_ALL,
RangerHelper.RESOURCE_ALL),
ImmutableMap.of(RangerHelper.RESOURCE_ALL,
RangerHelper.RESOURCE_ALL));
for (Map<String, String> mapName : loop) {
@@ -894,22 +917,23 @@ public abstract class RangerAuthorizationPlugin
* <br>
*/
private void doRenameTableMetadataObject(
- RangerMetadataObject rangerMetadataObject, RangerMetadataObject
newRangerMetadataObject) {
+ AuthorizationMetadataObject AuthorizationMetadataObject,
+ AuthorizationMetadataObject newAuthorizationMetadataObject) {
List<String> oldMetadataNames = new ArrayList<>();
List<String> newMetadataNames = new ArrayList<>();
List<Map<String, MetadataObject.Type>> loop =
ImmutableList.of(
- ImmutableMap.of(rangerMetadataObject.names().get(0),
MetadataObject.Type.SCHEMA),
- ImmutableMap.of(rangerMetadataObject.names().get(1),
MetadataObject.Type.TABLE),
+ ImmutableMap.of(AuthorizationMetadataObject.names().get(0),
MetadataObject.Type.SCHEMA),
+ ImmutableMap.of(AuthorizationMetadataObject.names().get(1),
MetadataObject.Type.TABLE),
ImmutableMap.of(RangerHelper.RESOURCE_ALL,
MetadataObject.Type.COLUMN));
for (Map<String, MetadataObject.Type> nameAndType : loop) {
oldMetadataNames.add(nameAndType.keySet().stream().findFirst().get());
if (nameAndType.containsValue(MetadataObject.Type.SCHEMA)) {
- newMetadataNames.add(newRangerMetadataObject.names().get(0));
+ newMetadataNames.add(newAuthorizationMetadataObject.names().get(0));
// Skip update the schema name operation
continue;
} else if (nameAndType.containsValue(MetadataObject.Type.TABLE)) {
- newMetadataNames.add(newRangerMetadataObject.names().get(1));
+ newMetadataNames.add(newAuthorizationMetadataObject.names().get(1));
} else if (nameAndType.containsValue(MetadataObject.Type.COLUMN)) {
newMetadataNames.add(RangerHelper.RESOURCE_ALL);
}
@@ -919,26 +943,28 @@ public abstract class RangerAuthorizationPlugin
/** rename the COLUMN, Only need to rename `*.*.{column}` <br> */
private void doRenameColumnMetadataObject(
- RangerMetadataObject rangerMetadataObject, RangerMetadataObject
newRangerMetadataObject) {
+ AuthorizationMetadataObject AuthorizationMetadataObject,
+ AuthorizationMetadataObject newAuthorizationMetadataObject) {
List<String> oldMetadataNames = new ArrayList<>();
List<String> newMetadataNames = new ArrayList<>();
List<Map<String, MetadataObject.Type>> loop =
ImmutableList.of(
- ImmutableMap.of(rangerMetadataObject.names().get(0),
MetadataObject.Type.SCHEMA),
- ImmutableMap.of(rangerMetadataObject.names().get(1),
MetadataObject.Type.TABLE),
- ImmutableMap.of(rangerMetadataObject.names().get(2),
MetadataObject.Type.COLUMN));
+ ImmutableMap.of(AuthorizationMetadataObject.names().get(0),
MetadataObject.Type.SCHEMA),
+ ImmutableMap.of(AuthorizationMetadataObject.names().get(1),
MetadataObject.Type.TABLE),
+ ImmutableMap.of(
+ AuthorizationMetadataObject.names().get(2),
MetadataObject.Type.COLUMN));
for (Map<String, MetadataObject.Type> nameAndType : loop) {
oldMetadataNames.add(nameAndType.keySet().stream().findFirst().get());
if (nameAndType.containsValue(MetadataObject.Type.SCHEMA)) {
- newMetadataNames.add(newRangerMetadataObject.names().get(0));
+ newMetadataNames.add(newAuthorizationMetadataObject.names().get(0));
// Skip update the schema name operation
continue;
} else if (nameAndType.containsValue(MetadataObject.Type.TABLE)) {
- newMetadataNames.add(newRangerMetadataObject.names().get(1));
+ newMetadataNames.add(newAuthorizationMetadataObject.names().get(1));
// Skip update the table name operation
continue;
} else if (nameAndType.containsValue(MetadataObject.Type.COLUMN)) {
- newMetadataNames.add(newRangerMetadataObject.names().get(2));
+ newMetadataNames.add(newAuthorizationMetadataObject.names().get(2));
}
updatePolicyByMetadataObject(MetadataObject.Type.COLUMN,
oldMetadataNames, newMetadataNames);
}
@@ -997,9 +1023,12 @@ public abstract class RangerAuthorizationPlugin
int index = operationTypeIndex.get(operationType);
// Update the policy name is following Gravitino's spec
- if
(policy.getName().equals(DOT_JOINER.join(oldMetadataNames))) {
+ if (policy
+ .getName()
+
.equals(AuthorizationSecurableObject.DOT_JOINER.join(oldMetadataNames))) {
List<String> policyNames =
- Lists.newArrayList(DOT_SPLITTER.splitToList(policyName));
+ Lists.newArrayList(
+
AuthorizationSecurableObject.DOT_SPLITTER.splitToList(policyName));
Preconditions.checkArgument(
policyNames.size() >= oldMetadataNames.size(),
String.format("The policy name(%s) is invalid!",
policyName));
@@ -1008,7 +1037,7 @@ public abstract class RangerAuthorizationPlugin
return;
}
policyNames.set(index, newMetadataNames.get(index));
- policy.setName(DOT_JOINER.join(policyNames));
+
policy.setName(AuthorizationSecurableObject.DOT_JOINER.join(policyNames));
}
// Update the policy resource name to new name
policy
@@ -1042,19 +1071,21 @@ public abstract class RangerAuthorizationPlugin
@Override
public void close() throws IOException {}
- /** Generate Ranger securable object */
- public RangerSecurableObject generateRangerSecurableObject(
- List<String> names, RangerMetadataObject.Type type, Set<RangerPrivilege>
privileges) {
- validateRangerMetadataObject(names, type);
- RangerMetadataObject rangerMetadataObject =
- new RangerMetadataObjects.RangerMetadataObjectImpl(
- RangerMetadataObjects.getParentFullName(names),
- RangerMetadataObjects.getLastName(names),
+ /** Generate authorization securable object */
+ public AuthorizationSecurableObject generateAuthorizationSecurableObject(
+ List<String> names,
+ AuthorizationMetadataObject.Type type,
+ Set<AuthorizationPrivilege> privileges) {
+ AuthorizationMetadataObject authMetadataObject =
+ new RangerMetadataObject(
+ AuthorizationMetadataObject.getParentFullName(names),
+ AuthorizationMetadataObject.getLastName(names),
type);
- return new RangerSecurableObjects.RangerSecurableObjectImpl(
- rangerMetadataObject.parent(),
- rangerMetadataObject.name(),
- rangerMetadataObject.type(),
+ authMetadataObject.validateAuthorizationMetadataObject();
+ return new RangerSecurableObject(
+ authMetadataObject.parent(),
+ authMetadataObject.name(),
+ authMetadataObject.type(),
privileges);
}
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 cb74ad026..d955f7656 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
@@ -26,6 +26,9 @@ import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.commons.lang.StringUtils;
+import org.apache.gravitino.authorization.AuthorizationMetadataObject;
+import org.apache.gravitino.authorization.AuthorizationPrivilege;
+import org.apache.gravitino.authorization.AuthorizationSecurableObject;
import org.apache.gravitino.authorization.Owner;
import org.apache.gravitino.authorization.Privilege;
import org.apache.gravitino.exceptions.AuthorizationPluginException;
@@ -49,7 +52,7 @@ public class RangerHelper {
/** The `*` gives access to all resources */
public static final String RESOURCE_ALL = "*";
/** The owner privileges, the owner can do anything on the metadata object */
- private final Set<RangerPrivilege> ownerPrivileges;
+ private final Set<AuthorizationPrivilege> ownerPrivileges;
/** The policy search keys */
protected final List<String> policyResourceDefines;
@@ -69,7 +72,7 @@ public class RangerHelper {
RangerClient rangerClient,
String rangerAdminName,
String rangerServiceName,
- Set<RangerPrivilege> ownerPrivileges,
+ Set<AuthorizationPrivilege> ownerPrivileges,
List<String> resourceDefines) {
this.rangerClient = rangerClient;
this.rangerAdminName = rangerAdminName;
@@ -102,7 +105,8 @@ public class RangerHelper {
* We cannot clean the policy items because one Ranger policy maybe contains
multiple Gravitino
* securable objects. <br>
*/
- void addPolicyItem(RangerPolicy policy, String roleName,
RangerSecurableObject securableObject) {
+ void addPolicyItem(
+ RangerPolicy policy, String roleName, AuthorizationSecurableObject
securableObject) {
// Add the policy items by the securable object's privileges
securableObject
.privileges()
@@ -191,12 +195,12 @@ public class RangerHelper {
/**
* Find the managed policy for the ranger securable object.
*
- * @param rangerMetadataObject The ranger securable object to find the
managed policy.
+ * @param AuthorizationMetadataObject The ranger securable object to find
the managed policy.
* @return The managed policy for the metadata object.
*/
- public RangerPolicy findManagedPolicy(RangerMetadataObject
rangerMetadataObject)
+ public RangerPolicy findManagedPolicy(AuthorizationMetadataObject
AuthorizationMetadataObject)
throws AuthorizationPluginException {
- List<RangerPolicy> policies =
wildcardSearchPolies(rangerMetadataObject.names());
+ List<RangerPolicy> policies =
wildcardSearchPolies(AuthorizationMetadataObject.names());
if (!policies.isEmpty()) {
/**
* Because Ranger doesn't support the precise search, Ranger will return
the policy meets the
@@ -204,7 +208,7 @@ public class RangerHelper {
* match `db1.table1`, `db1.table2`, `db*.table*`, So we need to
manually precisely filter
* this research results.
*/
- List<String> nsMetadataObj = rangerMetadataObject.names();
+ List<String> nsMetadataObj = AuthorizationMetadataObject.names();
Map<String, String> preciseFilters = new HashMap<>();
for (int i = 0; i < nsMetadataObj.size(); i++) {
preciseFilters.put(policyResourceDefines.get(i), nsMetadataObj.get(i));
@@ -438,7 +442,7 @@ public class RangerHelper {
});
}
- protected RangerPolicy createPolicyAddResources(RangerMetadataObject
metadataObject) {
+ protected RangerPolicy createPolicyAddResources(AuthorizationMetadataObject
metadataObject) {
RangerPolicy policy = new RangerPolicy();
policy.setService(rangerServiceName);
policy.setName(metadataObject.fullName());
@@ -451,7 +455,8 @@ public class RangerHelper {
return policy;
}
- protected RangerPolicy addOwnerToNewPolicy(RangerMetadataObject
metadataObject, Owner newOwner) {
+ protected RangerPolicy addOwnerToNewPolicy(
+ AuthorizationMetadataObject metadataObject, Owner newOwner) {
RangerPolicy policy = createPolicyAddResources(metadataObject);
ownerPrivileges.forEach(
@@ -476,7 +481,7 @@ public class RangerHelper {
}
protected RangerPolicy addOwnerRoleToNewPolicy(
- RangerMetadataObject metadataObject, String ownerRoleName) {
+ AuthorizationMetadataObject metadataObject, String ownerRoleName) {
RangerPolicy policy = createPolicyAddResources(metadataObject);
ownerPrivileges.forEach(
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/RangerMetadataObject.java
index e6611a179..b9354ee46 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/RangerMetadataObject.java
@@ -16,26 +16,20 @@
* specific language governing permissions and limitations
* under the License.
*/
-
package org.apache.gravitino.authorization.ranger;
+import com.google.common.base.Preconditions;
import java.util.List;
-import javax.annotation.Nullable;
import org.apache.gravitino.MetadataObject;
-import org.apache.gravitino.annotation.Unstable;
+import org.apache.gravitino.authorization.AuthorizationMetadataObject;
-/**
- * The Ranger MetadataObject is the basic unit of the Gravitino system. It
represents the Apache
- * Ranger metadata object in the Apache Gravitino system. The object can be a
catalog, schema,
- * table, column, etc.
- */
-@Unstable
-public interface RangerMetadataObject {
+/** The helper class for {@link AuthorizationMetadataObject}. */
+public class RangerMetadataObject implements AuthorizationMetadataObject {
/**
* The type of object in the Ranger system. Every type will map one kind of
the entity of the
* Gravitino type system.
*/
- enum Type {
+ 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. */
@@ -49,13 +43,13 @@ public interface RangerMetadataObject {
this.metadataType = type;
}
- public MetadataObject.Type getMetadataType() {
+ public MetadataObject.Type metadataObjectType() {
return metadataType;
}
public static Type fromMetadataType(MetadataObject.Type metadataType) {
for (Type type : Type.values()) {
- if (type.getMetadataType() == metadataType) {
+ if (type.metadataObjectType() == metadataType) {
return type;
}
}
@@ -64,47 +58,97 @@ public interface RangerMetadataObject {
}
}
- /**
- * The parent full name of the object. If the object doesn't have parent,
this method will return
- * null.
- *
- * @return The parent full name of the object.
- */
- @Nullable
- String parent();
+ /** The implementation of the {@link MetadataObject}. */
+ private final String name;
- /**
- * The name of the object.
- *
- * @return The name of the object.
- */
- String name();
+ private final String parent;
- /**
- * The all name list of the object.
- *
- * @return The name list of the object.
- */
- List<String> names();
+ private final AuthorizationMetadataObject.Type type;
/**
- * The full name of the object. Full name will be separated by "." to
represent a string
- * identifier of the object, like catalog, catalog.table, etc.
+ * Create the metadata object with the given name, parent and type.
*
- * @return The name of the object.
+ * @param parent The parent of the metadata object
+ * @param name The name of the metadata object
+ * @param type The type of the metadata object
*/
- default String fullName() {
- if (parent() == null) {
- return name();
- } else {
- return parent() + "." + name();
+ public RangerMetadataObject(String parent, String name,
AuthorizationMetadataObject.Type type) {
+ this.parent = parent;
+ this.name = name;
+ this.type = type;
+ }
+
+ @Override
+ public String name() {
+ return name;
+ }
+
+ @Override
+ public List<String> names() {
+ return DOT_SPLITTER.splitToList(fullName());
+ }
+
+ @Override
+ public String parent() {
+ return parent;
+ }
+
+ @Override
+ public AuthorizationMetadataObject.Type type() {
+ return type;
+ }
+
+ @Override
+ public void validateAuthorizationMetadataObject() throws
IllegalArgumentException {
+ List<String> names = names();
+ 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");
+ 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");
+
+ for (String name : names) {
+ Preconditions.checkArgument(name != null, "Cannot create a metadata
object with null name");
}
}
- /**
- * The type of the object.
- *
- * @return The type of the object.
- */
- Type type();
+ @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/RangerMetadataObjects.java
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObjects.java
deleted file mode 100644
index 7c7bed69d..000000000
---
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObjects.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * 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.Joiner;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Splitter;
-import java.util.List;
-import org.apache.gravitino.MetadataObject;
-
-/** The helper class for {@link RangerMetadataObject}. */
-public class RangerMetadataObjects {
- protected static final Splitter DOT_SPLITTER = Splitter.on('.');
-
- protected static final Joiner DOT_JOINER = Joiner.on('.');
-
- private RangerMetadataObjects() {}
-
- /**
- * Get the parent full name of the given full name.
- *
- * @param names The names of the metadata object
- * @return The parent full name if it exists, otherwise null
- */
- public static String getParentFullName(List<String> names) {
- if (names.size() <= 1) {
- return null;
- }
-
- return DOT_JOINER.join(names.subList(0, names.size() - 1));
- }
-
- static String getLastName(List<String> names) {
- Preconditions.checkArgument(names.size() > 0, "Cannot get the last name of
an empty list");
- return names.get(names.size() - 1);
- }
-
- static void checkName(String name) {
- Preconditions.checkArgument(name != null, "Cannot create a metadata object
with null name");
- }
-
- /** The implementation of the {@link MetadataObject}. */
- public static class RangerMetadataObjectImpl implements RangerMetadataObject
{
- private final String name;
-
- private final String parent;
-
- private final RangerMetadataObject.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 RangerMetadataObjectImpl(String parent, String name,
RangerMetadataObject.Type type) {
- this.parent = parent;
- this.name = name;
- this.type = type;
- }
-
- @Override
- public String name() {
- return name;
- }
-
- @Override
- public List<String> names() {
- return DOT_SPLITTER.splitToList(fullName());
- }
-
- @Override
- public String parent() {
- return parent;
- }
-
- @Override
- public Type type() {
- return type;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
-
- if (!(o instanceof RangerMetadataObjectImpl)) {
- return false;
- }
-
- RangerMetadataObjectImpl that = (RangerMetadataObjectImpl) 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/RangerPrivileges.java
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivileges.java
index e47b46efc..bbae16a6b 100644
---
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivileges.java
+++
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivileges.java
@@ -21,11 +21,12 @@ package org.apache.gravitino.authorization.ranger;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import java.util.List;
+import org.apache.gravitino.authorization.AuthorizationPrivilege;
import org.apache.gravitino.authorization.Privilege;
public class RangerPrivileges {
/** Ranger Hive privileges enumeration. */
- public enum RangerHadoopSQLPrivilege implements RangerPrivilege {
+ public enum RangerHadoopSQLPrivilege implements AuthorizationPrivilege {
ALL("all"),
SELECT("select"),
UPDATE("update"),
@@ -61,12 +62,12 @@ public class RangerPrivileges {
}
}
- public static class RangerHivePrivilegeImpl implements RangerPrivilege {
- private RangerPrivilege rangerHivePrivilege;
+ public static class RangerHivePrivilegeImpl implements
AuthorizationPrivilege {
+ private AuthorizationPrivilege rangerHivePrivilege;
private Privilege.Condition condition;
public RangerHivePrivilegeImpl(
- RangerPrivilege rangerHivePrivilege, Privilege.Condition condition) {
+ AuthorizationPrivilege rangerHivePrivilege, Privilege.Condition
condition) {
this.rangerHivePrivilege = rangerHivePrivilege;
this.condition = condition;
}
@@ -88,7 +89,7 @@ public class RangerPrivileges {
}
/** Ranger HDFS privileges enumeration. */
- public enum RangerHdfsPrivilege implements RangerPrivilege {
+ public enum RangerHdfsPrivilege implements AuthorizationPrivilege {
READ("read"),
WRITE("write"),
EXECUTE("execute");
@@ -115,18 +116,18 @@ public class RangerPrivileges {
}
}
- static List<Class<? extends Enum<? extends RangerPrivilege>>>
allRangerPrivileges =
+ static List<Class<? extends Enum<? extends AuthorizationPrivilege>>>
allRangerPrivileges =
Lists.newArrayList(
RangerHadoopSQLPrivilege.class,
RangerPrivileges.RangerHdfsPrivilege.class);
- public static RangerPrivilege valueOf(String name) {
+ public static AuthorizationPrivilege valueOf(String name) {
Preconditions.checkArgument(name != null, "Privilege name string cannot be
null!");
String strPrivilege = name.trim().toLowerCase();
- for (Class<? extends Enum<? extends RangerPrivilege>> enumClass :
allRangerPrivileges) {
- for (Enum<? extends RangerPrivilege> privilege :
enumClass.getEnumConstants()) {
- if (((RangerPrivilege) privilege).equalsTo(strPrivilege)) {
- return (RangerPrivilege) privilege;
+ for (Class<? extends Enum<? extends AuthorizationPrivilege>> enumClass :
allRangerPrivileges) {
+ for (Enum<? extends AuthorizationPrivilege> privilege :
enumClass.getEnumConstants()) {
+ if (((AuthorizationPrivilege) privilege).equalsTo(strPrivilege)) {
+ return (AuthorizationPrivilege) privilege;
}
}
}
diff --git
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivilegesMappingProvider.java
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivilegesMappingProvider.java
deleted file mode 100644
index ca11aaf70..000000000
---
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivilegesMappingProvider.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * 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 java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.apache.gravitino.MetadataObject;
-import org.apache.gravitino.authorization.Privilege;
-import org.apache.gravitino.authorization.SecurableObject;
-
-/**
- * Ranger authorization use this provider to mapping Gravitino privilege to
the Ranger privileges.
- * We can use this it to support the different Ranger authorization
components, such as Hive, HDFS,
- * HBase, etc.
- */
-public interface RangerPrivilegesMappingProvider {
- /**
- * Set the mapping Gravitino privilege name to the Ranger privileges rule.
- *
- * @return The mapping Gravitino privilege name to the Ranger privileges
rule.
- */
- Map<Privilege.Name, Set<RangerPrivilege>> privilegesMappingRule();
-
- /**
- * Set the owner Ranger privileges rule.
- *
- * @return The owner Ranger privileges rule.
- */
- Set<RangerPrivilege> ownerMappingRule();
-
- /**
- * Set the Ranger policy resource defines rule.
- *
- * @return The policy resource defines rule.
- */
- List<String> policyResourceDefinesRule();
-
- /**
- * Allow Gravitino privilege operation defines rule.
- *
- * @return The allow Gravitino privilege operation defines rule.
- */
- Set<Privilege.Name> allowPrivilegesRule();
-
- /**
- * Allow Gravitino MetadataObject type defines rule.
- *
- * @return The allow Gravitino MetadataObject type defines rule.
- */
- Set<MetadataObject.Type> allowMetadataObjectTypesRule();
-
- /**
- * Translate the Gravitino securable object to the Ranger securable object.
- *
- * @param securableObject The Gravitino securable object.
- * @return The Ranger securable object list.
- */
- List<RangerSecurableObject> translatePrivilege(SecurableObject
securableObject);
-
- /**
- * Translate the Gravitino securable object to the Ranger owner securable
object.
- *
- * @param metadataObject The Gravitino metadata object.
- * @return The Ranger owner securable object list.
- */
- List<RangerSecurableObject> translateOwner(MetadataObject metadataObject);
-
- /**
- * Translate the Gravitino metadata object to the Ranger metadata object.
- *
- * @param metadataObject The Gravitino metadata object.
- * @return The Ranger metadata object.
- */
- RangerMetadataObject translateMetadataObject(MetadataObject metadataObject);
-}
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/RangerSecurableObject.java
index da3311a17..3a6294f82 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/RangerSecurableObject.java
@@ -18,24 +18,37 @@
*/
package org.apache.gravitino.authorization.ranger;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
import java.util.List;
-import org.apache.gravitino.annotation.Unstable;
+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
+ implements AuthorizationSecurableObject {
+ private final List<AuthorizationPrivilege> privileges;
-/**
- * The Ranger securable object is the entity which access can be granted.
Unless allowed by a grant,
- * access is denied. <br>
- * You can use the helper class `RangerSecurableObjects` to create the Ranger
securable object which
- * you need. <br>
- * There is a clear difference between Ranger's Securable Object and
Gravitino's Securable Object,
- * Ranger's Securable Object does not have the concept of `METALAKE`, so it
needs to be defined
- * specifically.
- */
-@Unstable
-public interface RangerSecurableObject extends RangerMetadataObject {
/**
- * The privileges of the Ranger securable object.
+ * Create the Ranger securable object with the given name, parent and type.
*
- * @return The privileges of the securable object.
+ * @param parent The parent of the metadata object
+ * @param name The name of the metadata object
+ * @param type The type of the metadata object
*/
- List<RangerPrivilege> privileges();
+ public RangerSecurableObject(
+ String parent,
+ String name,
+ AuthorizationMetadataObject.Type type,
+ Set<AuthorizationPrivilege> privileges) {
+ super(parent, name, type);
+ this.privileges = ImmutableList.copyOf(Sets.newHashSet(privileges));
+ }
+
+ @Override
+ public List<AuthorizationPrivilege> privileges() {
+ return privileges;
+ }
}
diff --git
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObjects.java
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObjects.java
deleted file mode 100644
index 999f78684..000000000
---
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObjects.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.gravitino.authorization.ranger;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Sets;
-import java.util.List;
-import java.util.Set;
-import
org.apache.gravitino.authorization.ranger.RangerMetadataObjects.RangerMetadataObjectImpl;
-
-/** The helper class for {@link RangerSecurableObject}. */
-public class RangerSecurableObjects {
- public static class RangerSecurableObjectImpl extends
RangerMetadataObjectImpl
- implements RangerSecurableObject {
-
- private final List<RangerPrivilege> 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 RangerSecurableObjectImpl(
- String parent,
- String name,
- RangerMetadataObject.Type type,
- Set<RangerPrivilege> privileges) {
- super(parent, name, type);
- this.privileges = ImmutableList.copyOf(Sets.newHashSet(privileges));
- }
-
- @Override
- public List<RangerPrivilege> privileges() {
- return privileges;
- }
- }
-}
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 97f2b9035..50ca331d2 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
@@ -24,6 +24,8 @@ import java.util.Arrays;
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.Privilege;
import org.apache.gravitino.authorization.Privileges;
import org.apache.gravitino.authorization.SecurableObject;
@@ -31,7 +33,6 @@ import org.apache.gravitino.authorization.SecurableObjects;
import org.apache.gravitino.authorization.ranger.RangerAuthorizationPlugin;
import org.apache.gravitino.authorization.ranger.RangerHelper;
import org.apache.gravitino.authorization.ranger.RangerMetadataObject;
-import org.apache.gravitino.authorization.ranger.RangerSecurableObject;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Tag;
@@ -51,28 +52,28 @@ public class RangerAuthorizationPluginIT {
public void testTranslateMetadataObject() {
MetadataObject metalake =
MetadataObjects.parse(String.format("metalake1"),
MetadataObject.Type.METALAKE);
- RangerMetadataObject rangerMetalake =
rangerAuthPlugin.translateMetadataObject(metalake);
+ 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());
MetadataObject catalog =
MetadataObjects.parse(String.format("catalog1"),
MetadataObject.Type.CATALOG);
- RangerMetadataObject rangerCatalog =
rangerAuthPlugin.translateMetadataObject(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());
MetadataObject schema =
MetadataObjects.parse(String.format("catalog1.schema1"),
MetadataObject.Type.SCHEMA);
- RangerMetadataObject rangerSchema =
rangerAuthPlugin.translateMetadataObject(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());
MetadataObject table =
MetadataObjects.parse(String.format("catalog1.schema1.tab1"),
MetadataObject.Type.TABLE);
- RangerMetadataObject rangerTable =
rangerAuthPlugin.translateMetadataObject(table);
+ AuthorizationMetadataObject rangerTable =
rangerAuthPlugin.translateMetadataObject(table);
Assertions.assertEquals(2, rangerTable.names().size());
Assertions.assertEquals("schema1", rangerTable.names().get(0));
Assertions.assertEquals("tab1", rangerTable.names().get(1));
@@ -86,7 +87,7 @@ public class RangerAuthorizationPluginIT {
String.format("metalake1"),
MetadataObject.Type.METALAKE,
Lists.newArrayList(Privileges.CreateSchema.allow()));
- List<RangerSecurableObject> createSchemaInMetalake1 =
+ List<AuthorizationSecurableObject> createSchemaInMetalake1 =
rangerAuthPlugin.translatePrivilege(createSchemaInMetalake);
Assertions.assertEquals(1, createSchemaInMetalake1.size());
Assertions.assertEquals(RangerHelper.RESOURCE_ALL,
createSchemaInMetalake1.get(0).fullName());
@@ -98,7 +99,7 @@ public class RangerAuthorizationPluginIT {
String.format("catalog1"),
MetadataObject.Type.CATALOG,
Lists.newArrayList(Privileges.CreateSchema.allow()));
- List<RangerSecurableObject> createSchemaInCatalog1 =
+ List<AuthorizationSecurableObject> createSchemaInCatalog1 =
rangerAuthPlugin.translatePrivilege(createSchemaInCatalog);
Assertions.assertEquals(1, createSchemaInCatalog1.size());
Assertions.assertEquals(RangerHelper.RESOURCE_ALL,
createSchemaInCatalog1.get(0).fullName());
@@ -114,7 +115,7 @@ public class RangerAuthorizationPluginIT {
String.format("metalake1"),
MetadataObject.Type.METALAKE,
Lists.newArrayList(Privileges.CreateTable.allow()));
- List<RangerSecurableObject> metalake1 =
rangerAuthPlugin.translatePrivilege(metalake);
+ 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());
@@ -126,7 +127,7 @@ public class RangerAuthorizationPluginIT {
String.format("catalog1"),
MetadataObject.Type.CATALOG,
Lists.newArrayList(Privileges.CreateTable.allow()));
- List<RangerSecurableObject> catalog1 =
rangerAuthPlugin.translatePrivilege(catalog);
+ 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());
@@ -138,7 +139,7 @@ public class RangerAuthorizationPluginIT {
String.format("catalog1.schema1"),
MetadataObject.Type.SCHEMA,
Lists.newArrayList(privilege));
- List<RangerSecurableObject> schema1 =
rangerAuthPlugin.translatePrivilege(schema);
+ 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());
@@ -152,7 +153,7 @@ public class RangerAuthorizationPluginIT {
String.format("catalog1.schema1.table1"),
MetadataObject.Type.TABLE,
Lists.newArrayList(privilege));
- List<RangerSecurableObject> table1 =
rangerAuthPlugin.translatePrivilege(table);
+ 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());
@@ -167,7 +168,7 @@ public class RangerAuthorizationPluginIT {
for (MetadataObject.Type type :
ImmutableList.of(MetadataObject.Type.METALAKE,
MetadataObject.Type.CATALOG)) {
MetadataObject metalake = MetadataObjects.parse("metalake_or_catalog",
type);
- List<RangerSecurableObject> metalakeOwner =
rangerAuthPlugin.translateOwner(metalake);
+ 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());
@@ -178,7 +179,7 @@ public class RangerAuthorizationPluginIT {
}
MetadataObject schema = MetadataObjects.parse("catalog1.schema1",
MetadataObject.Type.SCHEMA);
- List<RangerSecurableObject> schemaOwner =
rangerAuthPlugin.translateOwner(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());
@@ -189,7 +190,7 @@ public class RangerAuthorizationPluginIT {
MetadataObject table =
MetadataObjects.parse("catalog1.schema1.table1",
MetadataObject.Type.TABLE);
- List<RangerSecurableObject> tableOwner =
rangerAuthPlugin.translateOwner(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());
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 7c45ff9b0..243491867 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
@@ -38,6 +38,7 @@ import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import org.apache.gravitino.MetadataObject;
import org.apache.gravitino.MetadataObjects;
+import org.apache.gravitino.authorization.AuthorizationSecurableObject;
import org.apache.gravitino.authorization.MetadataObjectChange;
import org.apache.gravitino.authorization.Owner;
import org.apache.gravitino.authorization.Privilege;
@@ -339,8 +340,8 @@ public class RangerHiveIT {
Lists.newArrayList(String.format("%s3", dbName), "tab*"),
GravitinoITUtils.genRandomName(currentFunName()));
// findManagedPolicy function use precise search, so return null
- RangerSecurableObject rangerSecurableObject =
- rangerAuthHivePlugin.generateRangerSecurableObject(
+ AuthorizationSecurableObject rangerSecurableObject =
+ rangerAuthHivePlugin.generateAuthorizationSecurableObject(
ImmutableList.of(String.format("%s3", dbName), "tab1"),
RangerMetadataObject.Type.TABLE,
ImmutableSet.of(
@@ -1825,7 +1826,7 @@ public class RangerHiveIT {
* @param rangerSecurableObject: the Ranger securable object to be verified
*/
private void verifyRangerSecurableObjectInRanger(
- RangerSecurableObject rangerSecurableObject,
+ AuthorizationSecurableObject rangerSecurableObject,
List<String> includeUsers,
List<String> excludeUsers,
List<String> includeGroups,
@@ -1937,24 +1938,26 @@ public class RangerHiveIT {
});
}
- private void verifyRangerSecurableObjectInRanger(RangerSecurableObject
securableObject) {
+ private void
verifyRangerSecurableObjectInRanger(AuthorizationSecurableObject
securableObject) {
verifyRangerSecurableObjectInRanger(securableObject, null, null, null,
null, null, null);
}
private void verifyRangerSecurableObjectInRanger(
- RangerSecurableObject securableObject, List<String> includeUsers) {
+ AuthorizationSecurableObject securableObject, List<String> includeUsers)
{
verifyRangerSecurableObjectInRanger(
securableObject, includeUsers, null, null, null, null, null);
}
private void verifyRangerSecurableObjectInRanger(
- RangerSecurableObject securableObject, List<String> includeUsers,
List<String> excludeUsers) {
+ AuthorizationSecurableObject securableObject,
+ List<String> includeUsers,
+ List<String> excludeUsers) {
verifyRangerSecurableObjectInRanger(
securableObject, includeUsers, excludeUsers, null, null, null, null);
}
private void verifyRangerSecurableObjectInRanger(
- RangerSecurableObject securableObject,
+ AuthorizationSecurableObject securableObject,
List<String> includeUsers,
List<String> excludeUsers,
List<String> includeGroups) {
@@ -1963,7 +1966,7 @@ public class RangerHiveIT {
}
private void verifyRangerSecurableObjectInRanger(
- RangerSecurableObject securableObject,
+ AuthorizationSecurableObject securableObject,
List<String> includeUsers,
List<String> excludeUsers,
List<String> includeGroups,
@@ -1973,7 +1976,7 @@ public class RangerHiveIT {
}
private void verifyRangerSecurableObjectInRanger(
- RangerSecurableObject securableObject,
+ AuthorizationSecurableObject securableObject,
List<String> includeUsers,
List<String> excludeUsers,
List<String> includeGroups,
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 0c6dd5803..4f4a5ff91 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
@@ -27,13 +27,13 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
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.RangerAuthorizationHadoopSQLPlugin;
import org.apache.gravitino.authorization.ranger.RangerAuthorizationPlugin;
import org.apache.gravitino.authorization.ranger.RangerHelper;
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.connector.AuthorizationPropertiesMeta;
import org.apache.gravitino.integration.test.container.ContainerSuite;
@@ -425,7 +425,7 @@ public class RangerITEnv {
role.securableObjects()
.forEach(
securableObject -> {
- List<RangerSecurableObject> rangerSecurableObjects =
+ List<AuthorizationSecurableObject> rangerSecurableObjects =
rangerAuthPlugin.translatePrivilege(securableObject);
rangerSecurableObjects.forEach(
diff --git
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObject.java
b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationMetadataObject.java
similarity index 53%
copy from
authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObject.java
copy to
core/src/main/java/org/apache/gravitino/authorization/AuthorizationMetadataObject.java
index e6611a179..07b72da82 100644
---
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObject.java
+++
b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationMetadataObject.java
@@ -16,53 +16,28 @@
* specific language governing permissions and limitations
* under the License.
*/
+package org.apache.gravitino.authorization;
-package org.apache.gravitino.authorization.ranger;
-
+import com.google.common.base.Joiner;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Splitter;
import java.util.List;
import javax.annotation.Nullable;
import org.apache.gravitino.MetadataObject;
-import org.apache.gravitino.annotation.Unstable;
/**
- * The Ranger MetadataObject is the basic unit of the Gravitino system. It
represents the Apache
- * Ranger metadata object in the Apache Gravitino system. The object can be a
catalog, schema,
- * table, column, etc.
+ * AuthorizationMetadataObject interface is used to define the underlying data
source metadata
+ * object.
*/
-@Unstable
-public interface RangerMetadataObject {
- /**
- * The type of object in the Ranger system. Every type will map one kind of
the entity of the
- * Gravitino type system.
- */
- enum 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);
-
- private final MetadataObject.Type metadataType;
-
- Type(MetadataObject.Type type) {
- this.metadataType = type;
- }
+public interface AuthorizationMetadataObject {
+ /** Underlying data source metadata object type. */
+ interface Type {
+ MetadataObject.Type metadataObjectType();
+ }
- public MetadataObject.Type getMetadataType() {
- return metadataType;
- }
+ Splitter DOT_SPLITTER = Splitter.on('.');
- public static Type fromMetadataType(MetadataObject.Type metadataType) {
- for (Type type : Type.values()) {
- if (type.getMetadataType() == metadataType) {
- return type;
- }
- }
- throw new IllegalArgumentException(
- "No matching RangerMetadataObject.Type for " + metadataType);
- }
- }
+ Joiner DOT_JOINER = Joiner.on('.');
/**
* The parent full name of the object. If the object doesn't have parent,
this method will return
@@ -89,7 +64,7 @@ public interface RangerMetadataObject {
/**
* The full name of the object. Full name will be separated by "." to
represent a string
- * identifier of the object, like catalog, catalog.table, etc.
+ * identifier of the object, like `catalog`, `catalog.table`, etc.
*
* @return The name of the object.
*/
@@ -101,10 +76,36 @@ public interface RangerMetadataObject {
}
}
+ /**
+ * Get the parent full name of the given full name.
+ *
+ * @param names The names of the metadata object
+ * @return The parent full name if it exists, otherwise null
+ */
+ static String getParentFullName(List<String> names) {
+ if (names.size() <= 1) {
+ return null;
+ }
+
+ return DOT_JOINER.join(names.subList(0, names.size() - 1));
+ }
+
+ static String getLastName(List<String> names) {
+ Preconditions.checkArgument(names.size() > 0, "Cannot get the last name of
an empty list");
+ return names.get(names.size() - 1);
+ }
+
/**
* The type of the object.
*
* @return The type of the object.
*/
Type type();
+
+ default MetadataObject.Type metadataObjectType() {
+ return type().metadataObjectType();
+ }
+
+ /** Validate different underlying datasource metadata object */
+ void validateAuthorizationMetadataObject() throws IllegalArgumentException;
}
diff --git
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivilege.java
b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationPrivilege.java
similarity index 80%
rename from
authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivilege.java
rename to
core/src/main/java/org/apache/gravitino/authorization/AuthorizationPrivilege.java
index 04774b417..4c58b9ffc 100644
---
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerPrivilege.java
+++
b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationPrivilege.java
@@ -16,12 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.gravitino.authorization.ranger;
+package org.apache.gravitino.authorization;
-import org.apache.gravitino.authorization.Privilege;
-
-/** RangerPrivilege interface is used to define the Ranger privileges. */
-public interface RangerPrivilege {
+/** AuthorizationPrivilege interface is used to define the underlying data
source privileges. */
+public interface AuthorizationPrivilege {
String getName();
Privilege.Condition condition();
diff --git
a/core/src/main/java/org/apache/gravitino/authorization/AuthorizationPrivilegesMappingProvider.java
b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationPrivilegesMappingProvider.java
new file mode 100644
index 000000000..218de2604
--- /dev/null
+++
b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationPrivilegesMappingProvider.java
@@ -0,0 +1,83 @@
+/*
+ * 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;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.apache.gravitino.MetadataObject;
+
+/**
+ * Authorization use this provider to mapping Gravitino privilege to the
underlying data source
+ * privileges. We can use this it to support the different data source, such
as Hive, HDFS, HBase,
+ * etc.
+ */
+public interface AuthorizationPrivilegesMappingProvider {
+ /**
+ * Set the mapping Gravitino privilege name to the underlying data source
privileges rule.
+ *
+ * @return The mapping Gravitino privilege name to the underlying data
source privileges rule.
+ */
+ Map<Privilege.Name, Set<AuthorizationPrivilege>> privilegesMappingRule();
+
+ /**
+ * Set the owner underlying data source privileges rule.
+ *
+ * @return The owner underlying data source privileges rule.
+ */
+ Set<AuthorizationPrivilege> ownerMappingRule();
+
+ /**
+ * Allow Gravitino privilege operation defines rule.
+ *
+ * @return The allow Gravitino privilege operation defines rule.
+ */
+ Set<Privilege.Name> allowPrivilegesRule();
+
+ /**
+ * Allow Gravitino MetadataObject type defines rule.
+ *
+ * @return To allow Gravitino MetadataObject type defines rule.
+ */
+ Set<MetadataObject.Type> allowMetadataObjectTypesRule();
+
+ /**
+ * Translate the Gravitino securable object to the underlying data source
securable object.
+ *
+ * @param securableObject The Gravitino securable object.
+ * @return The underlying data source securable object list.
+ */
+ List<AuthorizationSecurableObject> translatePrivilege(SecurableObject
securableObject);
+
+ /**
+ * Translate the Gravitino securable object to the underlying data source
owner securable object.
+ *
+ * @param metadataObject The Gravitino metadata object.
+ * @return The underlying data source owner securable object list.
+ */
+ List<AuthorizationSecurableObject> translateOwner(MetadataObject
metadataObject);
+
+ /**
+ * Translate the Gravitino metadata object to the underlying data source
metadata object.
+ *
+ * @param metadataObject The Gravitino metadata object.
+ * @return The underlying data source metadata object.
+ */
+ AuthorizationMetadataObject translateMetadataObject(MetadataObject
metadataObject);
+}
diff --git
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObjectRule.java
b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationSecurableObject.java
similarity index 55%
rename from
authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObjectRule.java
rename to
core/src/main/java/org/apache/gravitino/authorization/AuthorizationSecurableObject.java
index a8de00518..5c0e1b679 100644
---
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObjectRule.java
+++
b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationSecurableObject.java
@@ -16,13 +16,22 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.gravitino.authorization.ranger;
+package org.apache.gravitino.authorization;
import java.util.List;
-/** Different underlying datasource have different Ranger metadata object
rules */
-interface RangerMetadataObjectRule {
- /** Validate different underlying datasource Ranger metadata object */
- void validateRangerMetadataObject(List<String> names,
RangerMetadataObject.Type type)
- throws IllegalArgumentException;
+/**
+ * The authorization securable object is the entity which access can be
granted. Unless allowed by a
+ * grant, access is denied. <br>
+ * There is a clear difference between underlying datasource's Securable
Object and Gravitino's
+ * Securable Object, authorization's Securable Object does not have the
concept of `METALAKE`, so it
+ * needs to be defined specifically.
+ */
+public interface AuthorizationSecurableObject extends
AuthorizationMetadataObject {
+ /**
+ * The privileges of the authorization securable object.
+ *
+ * @return The privileges of the securable object.
+ */
+ List<AuthorizationPrivilege> privileges();
}