This is an automated email from the ASF dual-hosted git repository.
liuxun pushed a commit to branch branch-0.7
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/branch-0.7 by this push:
new fa7bb6389 [#4614] feat(auth-ranger): Support deny privilege in the
RangerAuthorizationPlugin (#5371)
fa7bb6389 is described below
commit fa7bb6389eee7a15ea6da0aa929748eb53dfcf15
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Wed Oct 30 17:57:49 2024 +0800
[#4614] feat(auth-ranger): Support deny privilege in the
RangerAuthorizationPlugin (#5371)
### What changes were proposed in this pull request?
Currently, RangerAuthorizationPlugin only supports allow privilege. So
we need support to deny privilege.
### Why are the changes needed?
Fix: #4614
### Does this PR introduce _any_ user-facing change?
N/A
### How was this patch tested?
Added some ITs
Co-authored-by: Xun <[email protected]>
---
.../ranger/RangerAuthorizationPlugin.java | 87 ++++--
.../authorization/ranger/RangerHelper.java | 69 ++---
.../ranger/integration/test/RangerHiveIT.java | 318 ++++++++++++++-------
.../ranger/integration/test/RangerITEnv.java | 54 ++--
4 files changed, 345 insertions(+), 183 deletions(-)
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 03376cb07..965c7df31 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
@@ -27,13 +27,13 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
import org.apache.gravitino.MetadataObject;
import org.apache.gravitino.authorization.Group;
import org.apache.gravitino.authorization.Owner;
+import org.apache.gravitino.authorization.Privilege;
import org.apache.gravitino.authorization.Role;
import org.apache.gravitino.authorization.RoleChange;
import org.apache.gravitino.authorization.SecurableObject;
@@ -562,6 +562,15 @@ public abstract class RangerAuthorizationPlugin
if (policy != null) {
// Check the policy item's accesses and roles equal the Ranger securable
object's privilege
+ List<RangerPrivilege> allowPrivilies =
+ securableObject.privileges().stream()
+ .filter(privilege -> privilege.condition() ==
Privilege.Condition.ALLOW)
+ .collect(Collectors.toList());
+ List<RangerPrivilege> denyPrivilies =
+ securableObject.privileges().stream()
+ .filter(privilege -> privilege.condition() ==
Privilege.Condition.DENY)
+ .collect(Collectors.toList());
+
Set<RangerPrivilege> policyPrivileges =
policy.getPolicyItems().stream()
.filter(policyItem -> policyItem.getRoles().contains(roleName))
@@ -569,7 +578,17 @@ public abstract class RangerAuthorizationPlugin
.map(RangerPolicy.RangerPolicyItemAccess::getType)
.map(RangerPrivileges::valueOf)
.collect(Collectors.toSet());
- if (policyPrivileges.containsAll(securableObject.privileges())) {
+
+ Set<RangerPrivilege> policyDenyPrivileges =
+ policy.getDenyPolicyItems().stream()
+ .filter(policyItem -> policyItem.getRoles().contains(roleName))
+ .flatMap(policyItem -> policyItem.getAccesses().stream())
+ .map(RangerPolicy.RangerPolicyItemAccess::getType)
+ .map(RangerPrivileges::valueOf)
+ .collect(Collectors.toSet());
+
+ if (policyPrivileges.containsAll(allowPrivilies)
+ && policyDenyPrivileges.containsAll(denyPrivilies)) {
LOG.info(
"The privilege({}) already added to Ranger policy({})!",
policy.getName(),
@@ -614,24 +633,25 @@ public abstract class RangerAuthorizationPlugin
return true;
}
- policy
- .getPolicyItems()
+ rangerSecurableObject.privileges().stream()
.forEach(
- policyItem -> {
- boolean match =
- policyItem.getAccesses().stream()
- .allMatch(
- // Find the policy item that matches access and role
- access -> {
- // Use Gravitino privilege to search the Ranger
policy item's access
- boolean matchPrivilege =
- rangerSecurableObject.privileges().stream()
- .filter(Objects::nonNull)
- .anyMatch(privilege ->
privilege.equalsTo(access.getType()));
- return matchPrivilege;
- });
- if (match) {
- policyItem.getRoles().removeIf(roleName::equals);
+ rangerPrivilege -> {
+ if (rangerPrivilege.condition() == Privilege.Condition.ALLOW) {
+ policy
+ .getPolicyItems()
+ .forEach(
+ policyItem -> {
+ removePolicyItemIfEqualRoleName(
+ policyItem, rangerSecurableObject, roleName);
+ });
+ } else {
+ policy
+ .getDenyPolicyItems()
+ .forEach(
+ policyItem -> {
+ removePolicyItemIfEqualRoleName(
+ policyItem, rangerSecurableObject, roleName);
+ });
}
});
@@ -643,9 +663,16 @@ public abstract class RangerAuthorizationPlugin
policyItem.getRoles().isEmpty()
&& policyItem.getUsers().isEmpty()
&& policyItem.getGroups().isEmpty());
+ policy
+ .getDenyPolicyItems()
+ .removeIf(
+ policyItem ->
+ policyItem.getRoles().isEmpty()
+ && policyItem.getUsers().isEmpty()
+ && policyItem.getGroups().isEmpty());
try {
- if (policy.getPolicyItems().isEmpty()) {
+ if (policy.getPolicyItems().isEmpty() &&
policy.getDenyPolicyItems().isEmpty()) {
rangerClient.deletePolicy(policy.getId());
} else {
rangerClient.updatePolicy(policy.getId(), policy);
@@ -657,6 +684,26 @@ public abstract class RangerAuthorizationPlugin
return true;
}
+ private void removePolicyItemIfEqualRoleName(
+ RangerPolicy.RangerPolicyItem policyItem,
+ RangerSecurableObject rangerSecurableObject,
+ String roleName) {
+ boolean match =
+ policyItem.getAccesses().stream()
+ .allMatch(
+ // Find the policy item that matches access and role
+ access -> {
+ // Use Gravitino privilege to search the Ranger policy
item's access
+ boolean matchPrivilege =
+ rangerSecurableObject.privileges().stream()
+ .anyMatch(privilege ->
privilege.equalsTo(access.getType()));
+ return matchPrivilege;
+ });
+ if (match) {
+ policyItem.getRoles().removeIf(roleName::equals);
+ }
+ }
+
@Override
public void close() throws IOException {}
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 dde7b7328..51a61560f 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
@@ -112,15 +112,28 @@ public class RangerHelper {
.forEach(
rangerPrivilege -> {
// Find the policy item that matches Gravitino privilege
- List<RangerPolicy.RangerPolicyItem> matchPolicyItems =
- policy.getPolicyItems().stream()
- .filter(
- policyItem -> {
- return policyItem.getAccesses().stream()
- .anyMatch(
- access ->
access.getType().equals(rangerPrivilege.getName()));
- })
- .collect(Collectors.toList());
+ List<RangerPolicy.RangerPolicyItem> matchPolicyItems;
+ if (rangerPrivilege.condition() == Privilege.Condition.ALLOW) {
+ matchPolicyItems =
+ policy.getPolicyItems().stream()
+ .filter(
+ policyItem -> {
+ return policyItem.getAccesses().stream()
+ .anyMatch(
+ access ->
access.getType().equals(rangerPrivilege.getName()));
+ })
+ .collect(Collectors.toList());
+ } else {
+ matchPolicyItems =
+ policy.getDenyPolicyItems().stream()
+ .filter(
+ policyItem -> {
+ return policyItem.getAccesses().stream()
+ .anyMatch(
+ access ->
access.getType().equals(rangerPrivilege.getName()));
+ })
+ .collect(Collectors.toList());
+ }
if (matchPolicyItems.isEmpty()) {
// If the policy item does not exist, then create a new policy
item
@@ -149,44 +162,6 @@ public class RangerHelper {
});
}
- /**
- * Remove policy item base the securable object's privileges and role name.
<br>
- * We cannot directly clean the policy items because one Ranger policy maybe
contains multiple
- * Gravitino privilege objects. <br>
- */
- void removePolicyItem(
- RangerPolicy policy, String roleName, RangerSecurableObject
securableObject) {
- // Delete the policy role base the securable object's privileges
- policy.getPolicyItems().stream()
- .forEach(
- policyItem -> {
- policyItem
- .getAccesses()
- .forEach(
- access -> {
- boolean matchPrivilege =
- securableObject.privileges().stream()
- .anyMatch(
- privilege -> {
- return
access.getType().equals(privilege.getName());
- });
- if (matchPrivilege) {
- policyItem.getRoles().removeIf(roleName::equals);
- }
- });
- });
-
- // Delete the policy items if the roles are empty and not ownership policy
item
- policy
- .getPolicyItems()
- .removeIf(
- policyItem -> {
- return policyItem.getRoles().isEmpty()
- && policyItem.getUsers().isEmpty()
- && policyItem.getGroups().isEmpty();
- });
- }
-
/**
* Find the managed policy for the ranger securable object.
*
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 c105d42fd..85aa2f5b2 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
@@ -31,6 +31,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
import org.apache.gravitino.MetadataObject;
import org.apache.gravitino.MetadataObjects;
import org.apache.gravitino.authorization.Owner;
@@ -152,6 +153,72 @@ public class RangerHiveIT {
verifyRoleInRanger(rangerAuthHivePlugin, role);
}
+ @Test
+ public void testOnDenyRoleCreated() {
+ String schemaName = currentFunName();
+ SecurableObject securableObject1 =
+ SecurableObjects.parse(
+ String.format("catalog.%s", schemaName), // use unique db name to
avoid conflict
+ MetadataObject.Type.SCHEMA,
+ Lists.newArrayList(Privileges.CreateTable.deny()));
+
+ SecurableObject securableObject2 =
+ SecurableObjects.parse(
+ String.format("catalog.%s.tab2", schemaName),
+ SecurableObject.Type.TABLE,
+ Lists.newArrayList(Privileges.SelectTable.deny()));
+
+ SecurableObject securableObject3 =
+ SecurableObjects.parse(
+ String.format("catalog.%s.tab3", schemaName),
+ SecurableObject.Type.TABLE,
+ Lists.newArrayList(Privileges.ModifyTable.deny()));
+
+ RoleEntity role =
+ RoleEntity.builder()
+ .withId(1L)
+ .withName(schemaName)
+ .withAuditInfo(auditInfo)
+ .withSecurableObjects(
+ Lists.newArrayList(securableObject1, securableObject2,
securableObject3))
+ .build();
+ Assertions.assertTrue(rangerAuthHivePlugin.onRoleCreated(role));
+ verifyRoleInRanger(rangerAuthHivePlugin, role);
+ }
+
+ @Test
+ public void testOnMixRoleCreated() {
+ String schemaName = currentFunName();
+ SecurableObject securableObject1 =
+ SecurableObjects.parse(
+ String.format("catalog.%s", schemaName), // use unique db name to
avoid conflict
+ MetadataObject.Type.SCHEMA,
+ Lists.newArrayList(Privileges.SelectTable.allow(),
Privileges.CreateTable.deny()));
+
+ SecurableObject securableObject2 =
+ SecurableObjects.parse(
+ String.format("catalog.%s.tab2", schemaName),
+ SecurableObject.Type.TABLE,
+ Lists.newArrayList(Privileges.SelectTable.allow(),
Privileges.ModifyTable.deny()));
+
+ SecurableObject securableObject3 =
+ SecurableObjects.parse(
+ String.format("catalog.%s.tab3", schemaName),
+ SecurableObject.Type.TABLE,
+ Lists.newArrayList(Privileges.SelectTable.deny(),
Privileges.ModifyTable.allow()));
+
+ RoleEntity role =
+ RoleEntity.builder()
+ .withId(1L)
+ .withName(schemaName)
+ .withAuditInfo(auditInfo)
+ .withSecurableObjects(
+ Lists.newArrayList(securableObject1, securableObject2,
securableObject3))
+ .build();
+ Assertions.assertTrue(rangerAuthHivePlugin.onRoleCreated(role));
+ verifyRoleInRanger(rangerAuthHivePlugin, role);
+ }
+
@Test
public void testOnRoleCreatedCatalog() {
Role mockCatalogRole = mockCatalogRole(currentFunName());
@@ -162,6 +229,45 @@ public class RangerHiveIT {
assertFindManagedPolicy(mockCatalogRole, false);
}
+ @Test
+ public void testOnDenyRoleCreatedCatalog() {
+ String roleName = currentFunName();
+ SecurableObject securableObject1 =
+ SecurableObjects.parse(
+ currentFunName(),
+ SecurableObject.Type.CATALOG,
+ Lists.newArrayList(Privileges.CreateSchema.deny()));
+ RoleEntity mockCatalogRole =
+ RoleEntity.builder()
+ .withId(1L)
+ .withName(roleName)
+ .withAuditInfo(auditInfo)
+ .withSecurableObjects(Lists.newArrayList(securableObject1))
+ .build();
+
+ Assertions.assertTrue(rangerAuthHivePlugin.onRoleCreated(mockCatalogRole));
+ // Check if exist this policy
+ assertFindManagedPolicy(mockCatalogRole, true);
+ mockCatalogRole.securableObjects().stream()
+ .forEach(
+ securableObject -> {
+ rangerAuthHivePlugin.translatePrivilege(securableObject).stream()
+ .forEach(
+ rangerSecurableObject -> {
+ verifyRangerSecurableObjectInRanger(
+ rangerSecurableObject,
+ null,
+ null,
+ null,
+ null,
+ Lists.newArrayList(roleName));
+ });
+ });
+
+ Assertions.assertTrue(rangerAuthHivePlugin.onRoleDeleted(mockCatalogRole));
+ assertFindManagedPolicy(mockCatalogRole, false);
+ }
+
@Test
public void testOnRoleDeleted() {
// prepare to create a role
@@ -517,7 +623,8 @@ public class RangerHiveIT {
rangerAuthHivePlugin.translateOwner(oldMetadataObject).stream()
.forEach(
rangerSecurableObject -> {
- verifyOwnerInRanger(rangerSecurableObject,
Lists.newArrayList(userName));
+ verifyRangerSecurableObjectInRanger(
+ rangerSecurableObject, Lists.newArrayList(userName));
});
SecurableObject oldSecurableObject =
@@ -558,7 +665,8 @@ public class RangerHiveIT {
rangerAuthHivePlugin.translateOwner(oldMetadataObject).stream()
.forEach(
rangerSecurableObject -> {
- verifyOwnerInRanger(rangerSecurableObject,
Lists.newArrayList(userName));
+ verifyRangerSecurableObjectInRanger(
+ rangerSecurableObject, Lists.newArrayList(userName));
});
// Delete the role
@@ -568,7 +676,8 @@ public class RangerHiveIT {
rangerAuthHivePlugin.translateOwner(oldMetadataObject).stream()
.forEach(
rangerSecurableObject -> {
- verifyOwnerInRanger(rangerSecurableObject,
Lists.newArrayList(userName));
+ verifyRangerSecurableObjectInRanger(
+ rangerSecurableObject, Lists.newArrayList(userName));
});
}
@@ -768,7 +877,8 @@ public class RangerHiveIT {
rangerAuthHivePlugin.translateOwner(schema).stream()
.forEach(
rangerSecurableObject -> {
- verifyOwnerInRanger(rangerSecurableObject,
Lists.newArrayList(userName1));
+ verifyRangerSecurableObjectInRanger(
+ rangerSecurableObject, Lists.newArrayList(userName1));
});
MetadataObject table =
@@ -780,7 +890,8 @@ public class RangerHiveIT {
rangerAuthHivePlugin.translateOwner(table).stream()
.forEach(
rangerSecurableObject -> {
- verifyOwnerInRanger(rangerSecurableObject,
Lists.newArrayList(userName2));
+ verifyRangerSecurableObjectInRanger(
+ rangerSecurableObject, Lists.newArrayList(userName2));
});
String userName3 = "user3";
@@ -789,7 +900,7 @@ public class RangerHiveIT {
rangerAuthHivePlugin.translateOwner(table).stream()
.forEach(
rangerSecurableObject -> {
- verifyOwnerInRanger(
+ verifyRangerSecurableObjectInRanger(
rangerSecurableObject,
Lists.newArrayList(userName3),
Lists.newArrayList(userName2));
@@ -801,7 +912,7 @@ public class RangerHiveIT {
rangerAuthHivePlugin.translateOwner(table).stream()
.forEach(
rangerSecurableObject -> {
- verifyOwnerInRanger(
+ verifyRangerSecurableObjectInRanger(
rangerSecurableObject,
null,
Lists.newArrayList(userName1, userName2),
@@ -814,7 +925,7 @@ public class RangerHiveIT {
rangerAuthHivePlugin.translateOwner(table).stream()
.forEach(
rangerSecurableObject -> {
- verifyOwnerInRanger(
+ verifyRangerSecurableObjectInRanger(
rangerSecurableObject,
null,
Lists.newArrayList(userName1, userName2),
@@ -834,7 +945,7 @@ public class RangerHiveIT {
rangerAuthHivePlugin.translateOwner(metalake).stream()
.forEach(
rangerSecurableObject -> {
- verifyOwnerInRanger(
+ verifyRangerSecurableObjectInRanger(
rangerSecurableObject,
null,
null,
@@ -852,7 +963,7 @@ public class RangerHiveIT {
rangerAuthHivePlugin.translateOwner(catalog).stream()
.forEach(
rangerSecurableObject -> {
- verifyOwnerInRanger(
+ verifyRangerSecurableObjectInRanger(
rangerSecurableObject,
null,
null,
@@ -913,7 +1024,7 @@ public class RangerHiveIT {
rangerAuthHivePlugin.translateOwner(securableObject1).stream()
.forEach(
rangerSecurableObject -> {
- verifyOwnerInRanger(
+ verifyRangerSecurableObjectInRanger(
rangerSecurableObject, Lists.newArrayList(ownerName), null,
null, null);
});
@@ -1296,10 +1407,10 @@ public class RangerHiveIT {
/**
* Verify the Gravitino role in Ranger service
*
- * <p>metadataObject: the Gravitino securable object to be verified
+ * @param rangerSecurableObject: the Ranger securable object to be verified
*/
- private void verifyOwnerInRanger(
- RangerMetadataObject metadataObject,
+ private void verifyRangerSecurableObjectInRanger(
+ RangerSecurableObject rangerSecurableObject,
List<String> includeUsers,
List<String> excludeUsers,
List<String> includeGroups,
@@ -1307,7 +1418,7 @@ public class RangerHiveIT {
List<String> includeRoles,
List<String> excludeRoles) {
// Find policy by each metadata Object
- String policyName = metadataObject.fullName();
+ String policyName = rangerSecurableObject.fullName();
RangerPolicy policy;
try {
policy =
RangerITEnv.rangerClient.getPolicy(RangerITEnv.RANGER_HIVE_REPO_NAME,
policyName);
@@ -1321,7 +1432,7 @@ public class RangerHiveIT {
Assertions.assertTrue(policy.getPolicyLabels().contains(RangerHelper.MANAGED_BY_GRAVITINO));
// verify namespace
- List<String> metaObjNamespaces = metadataObject.names();
+ List<String> metaObjNamespaces = rangerSecurableObject.names();
List<String> rolePolicies = new ArrayList<>();
for (int i = 0; i < metaObjNamespaces.size(); i++) {
rolePolicies.add(
@@ -1336,113 +1447,126 @@ public class RangerHiveIT {
}
Assertions.assertEquals(metaObjNamespaces, rolePolicies);
- policy.getPolicyItems().stream()
- .filter(
- policyItem -> {
- // Filter Ranger policy item by Gravitino privilege
- return policyItem.getAccesses().stream()
- .anyMatch(
- access -> {
- return rangerAuthHivePlugin
- .ownerMappingRule()
-
.contains(RangerPrivileges.valueOf(access.getType()));
- });
- })
- .anyMatch(
- policyItem -> {
- if (includeUsers != null && !includeUsers.isEmpty()) {
- if (!policyItem.getUsers().containsAll(includeUsers)) {
- return false;
- }
- }
- if (excludeUsers != null && !excludeUsers.isEmpty()) {
- boolean containExcludeUser =
- policyItem.getUsers().stream()
- .anyMatch(
- user -> {
- return excludeUsers.contains(user);
- });
- if (containExcludeUser) {
- return false;
- }
- }
- if (includeGroups != null && !includeGroups.isEmpty()) {
- if (!policyItem.getGroups().containsAll(includeGroups)) {
- return false;
- }
- }
- if (excludeGroups != null && !excludeGroups.isEmpty()) {
- boolean containExcludeGroup =
- policyItem.getGroups().stream()
- .anyMatch(
- user -> {
- return excludeGroups.contains(user);
- });
- if (containExcludeGroup) {
- return false;
- }
- }
- if (includeRoles != null && !includeRoles.isEmpty()) {
- if (!policyItem.getRoles().containsAll(includeRoles)) {
- return false;
- }
- }
- if (excludeRoles != null && !excludeRoles.isEmpty()) {
- boolean containExcludeRole =
- policyItem.getRoles().stream()
- .anyMatch(
- role -> {
- return excludeRoles.contains(role);
- });
- if (containExcludeRole) {
- return false;
- }
+ AtomicReference<List<RangerPolicy.RangerPolicyItem>> policyItems = new
AtomicReference<>();
+ rangerSecurableObject.privileges().stream()
+ .forEach(
+ privilege -> {
+ if (privilege.condition() == Privilege.Condition.ALLOW) {
+ policyItems.set(policy.getPolicyItems());
+ } else {
+ policyItems.set(policy.getDenyPolicyItems());
}
- return true;
+ policyItems.get().stream()
+ .filter(
+ policyItem -> {
+ // Filter Ranger policy item by Gravitino privilege
+ return policyItem.getAccesses().stream()
+ .anyMatch(
+ access -> {
+ return rangerAuthHivePlugin
+ .ownerMappingRule()
+
.contains(RangerPrivileges.valueOf(access.getType()));
+ });
+ })
+ .allMatch(
+ policyItem -> {
+ if (includeUsers != null && !includeUsers.isEmpty()) {
+ if
(!policyItem.getUsers().containsAll(includeUsers)) {
+ return false;
+ }
+ }
+ if (excludeUsers != null && !excludeUsers.isEmpty()) {
+ boolean containExcludeUser =
+ policyItem.getUsers().stream()
+ .anyMatch(
+ user -> {
+ return excludeUsers.contains(user);
+ });
+ if (containExcludeUser) {
+ return false;
+ }
+ }
+ if (includeGroups != null && !includeGroups.isEmpty())
{
+ if
(!policyItem.getGroups().containsAll(includeGroups)) {
+ return false;
+ }
+ }
+ if (excludeGroups != null && !excludeGroups.isEmpty())
{
+ boolean containExcludeGroup =
+ policyItem.getGroups().stream()
+ .anyMatch(
+ user -> {
+ return excludeGroups.contains(user);
+ });
+ if (containExcludeGroup) {
+ return false;
+ }
+ }
+ if (includeRoles != null && !includeRoles.isEmpty()) {
+ if
(!policyItem.getRoles().containsAll(includeRoles)) {
+ return false;
+ }
+ }
+ if (excludeRoles != null && !excludeRoles.isEmpty()) {
+ boolean containExcludeRole =
+ policyItem.getRoles().stream()
+ .anyMatch(
+ role -> {
+ return excludeRoles.contains(role);
+ });
+ if (containExcludeRole) {
+ return false;
+ }
+ }
+ return true;
+ });
});
}
- private void verifyOwnerInRanger(RangerMetadataObject metadataObject) {
- verifyOwnerInRanger(metadataObject, null, null, null, null, null, null);
+ private void verifyRangerSecurableObjectInRanger(RangerSecurableObject
securableObject) {
+ verifyRangerSecurableObjectInRanger(securableObject, null, null, null,
null, null, null);
}
- private void verifyOwnerInRanger(RangerMetadataObject metadataObject,
List<String> includeUsers) {
- verifyOwnerInRanger(metadataObject, includeUsers, null, null, null, null,
null);
+ private void verifyRangerSecurableObjectInRanger(
+ RangerSecurableObject securableObject, List<String> includeUsers) {
+ verifyRangerSecurableObjectInRanger(
+ securableObject, includeUsers, null, null, null, null, null);
}
- private void verifyOwnerInRanger(
- RangerMetadataObject metadataObject, List<String> includeUsers,
List<String> excludeUsers) {
- verifyOwnerInRanger(metadataObject, includeUsers, excludeUsers, null,
null, null, null);
+ private void verifyRangerSecurableObjectInRanger(
+ RangerSecurableObject securableObject, List<String> includeUsers,
List<String> excludeUsers) {
+ verifyRangerSecurableObjectInRanger(
+ securableObject, includeUsers, excludeUsers, null, null, null, null);
}
- private void verifyOwnerInRanger(
- RangerMetadataObject metadataObject,
+ private void verifyRangerSecurableObjectInRanger(
+ RangerSecurableObject securableObject,
List<String> includeUsers,
List<String> excludeUsers,
List<String> includeGroups) {
- verifyOwnerInRanger(
- metadataObject, includeUsers, excludeUsers, includeGroups, null, null,
null);
+ verifyRangerSecurableObjectInRanger(
+ securableObject, includeUsers, excludeUsers, includeGroups, null,
null, null);
}
- private void verifyOwnerInRanger(
- RangerMetadataObject metadataObject,
+ private void verifyRangerSecurableObjectInRanger(
+ RangerSecurableObject securableObject,
List<String> includeUsers,
List<String> excludeUsers,
List<String> includeGroups,
List<String> excludeGroups) {
- verifyOwnerInRanger(
- metadataObject, includeUsers, excludeUsers, includeGroups,
excludeGroups, null, null);
+ verifyRangerSecurableObjectInRanger(
+ securableObject, includeUsers, excludeUsers, includeGroups,
excludeGroups, null, null);
}
- private void verifyOwnerInRanger(
- RangerMetadataObject metadataObject,
+ private void verifyRangerSecurableObjectInRanger(
+ RangerSecurableObject securableObject,
List<String> includeUsers,
List<String> excludeUsers,
List<String> includeGroups,
List<String> excludeGroups,
List<String> includeRoles) {
- verifyOwnerInRanger(
- metadataObject,
+ verifyRangerSecurableObjectInRanger(
+ securableObject,
includeUsers,
excludeUsers,
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 1a5218b08..653d17202 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
@@ -25,7 +25,9 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
+import org.apache.gravitino.authorization.Privilege;
import org.apache.gravitino.authorization.Role;
import org.apache.gravitino.authorization.ranger.RangerAuthorizationHivePlugin;
import org.apache.gravitino.authorization.ranger.RangerAuthorizationPlugin;
@@ -443,26 +445,40 @@ public class RangerITEnv {
LOG.error("Failed to get policy: " +
securableObject.fullName());
throw new RuntimeException(e);
}
- boolean match =
- policy.getPolicyItems().stream()
- .filter(
- policyItem -> {
- // Filter Ranger policy item by Gravitino
privilege
- return policyItem.getAccesses().stream()
- .anyMatch(
- access -> {
- return rangerSecurableObject
- .privileges()
- .contains(
-
RangerPrivileges.valueOf(access.getType()));
+
+ AtomicReference<List<RangerPolicy.RangerPolicyItem>>
policyItems =
+ new AtomicReference<>();
+ rangerSecurableObject.privileges().stream()
+ .forEach(
+ privilege -> {
+ if (privilege.condition() ==
Privilege.Condition.ALLOW) {
+ policyItems.set(policy.getPolicyItems());
+ } else {
+ policyItems.set(policy.getDenyPolicyItems());
+ }
+
+ boolean match =
+ policyItems.get().stream()
+ .filter(
+ policyItem -> {
+ // Filter Ranger policy item by
Gravitino privilege
+ return
policyItem.getAccesses().stream()
+ .allMatch(
+ access -> {
+ return
rangerSecurableObject
+ .privileges()
+ .contains(
+
RangerPrivileges.valueOf(
+
access.getType()));
+ });
+ })
+ .allMatch(
+ policyItem -> {
+ // Verify role name in Ranger
policy item
+ return
policyItem.getRoles().contains(role.name());
});
- })
- .allMatch(
- policyItem -> {
- // Verify role name in Ranger policy item
- return
policyItem.getRoles().contains(role.name());
- });
- Assertions.assertTrue(match);
+ Assertions.assertTrue(match);
+ });
});
});
}