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 33bc3e3a80 [#7843] fix(authz): MetadataIdConverter can not get role id
(#7844)
33bc3e3a80 is described below
commit 33bc3e3a80f6d2578451895f32c1d9e524f19b00
Author: yangyang zhong <[email protected]>
AuthorDate: Fri Aug 1 10:46:51 2025 +0800
[#7843] fix(authz): MetadataIdConverter can not get role id (#7844)
### What changes were proposed in this pull request?
Fix MetadataIdConverter can not get role id
### Why are the changes needed?
Fix: #7843
### Does this PR introduce _any_ user-facing change?
None
### How was this patch tested?
org.apache.gravitino.client.integration.test.authorization.OwnerAuthorizationIT#testSetRoleOwner
---
.../test/authorization/OwnerAuthorizationIT.java | 26 ++++++++++++++++++++++
.../test/authorization/RoleAuthorizationIT.java | 17 ++------------
.../server/authorization/MetadataIdConverter.java | 9 +++-----
.../authorization/jcasbin/JcasbinAuthorizer.java | 9 +-------
.../gravitino/server/web/rest/OwnerOperations.java | 9 ++++++--
5 files changed, 39 insertions(+), 31 deletions(-)
diff --git
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/OwnerAuthorizationIT.java
b/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/OwnerAuthorizationIT.java
index 019c571072..11a18d734d 100644
---
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/OwnerAuthorizationIT.java
+++
b/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/OwnerAuthorizationIT.java
@@ -278,4 +278,30 @@ public class OwnerAuthorizationIT extends
BaseRestApiAuthorizationIT {
USER,
Owner.Type.USER);
}
+
+ @Test
+ public void testSetRoleOwner() {
+ GravitinoMetalake gravitinoMetalake = client.loadMetalake(METALAKE);
+ String tempRole = "tempRole";
+ String tempUser = "tempUser";
+ gravitinoMetalake.addUser(tempUser);
+ gravitinoMetalake.createRole(tempRole, new HashMap<>(),
Collections.emptyList());
+ // normal user can not set owner
+ GravitinoMetalake gravitinoMetalakeLoadByNormalUser =
normalUserClient.loadMetalake(METALAKE);
+ assertThrows(
+ "Current user can not set owner",
+ RuntimeException.class,
+ () -> {
+ gravitinoMetalakeLoadByNormalUser.setOwner(
+ MetadataObjects.of(ImmutableList.of(tempRole),
MetadataObject.Type.ROLE),
+ tempUser,
+ Owner.Type.USER);
+ });
+ gravitinoMetalake.setOwner(
+ MetadataObjects.of(ImmutableList.of(tempRole),
MetadataObject.Type.ROLE),
+ tempUser,
+ Owner.Type.USER);
+ // reset
+ gravitinoMetalake.deleteRole(tempRole);
+ }
}
diff --git
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/RoleAuthorizationIT.java
b/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/RoleAuthorizationIT.java
index 746545b852..542d3dc44a 100644
---
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/RoleAuthorizationIT.java
+++
b/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/RoleAuthorizationIT.java
@@ -49,7 +49,7 @@ public class RoleAuthorizationIT extends
BaseRestApiAuthorizationIT {
() -> {
normalUserClient
.loadMetalake(METALAKE)
- .createRole("role2", new HashMap<>(), Collections.emptyList());
+ .createRole("role4", new HashMap<>(), Collections.emptyList());
});
client.loadMetalake(METALAKE).grantRolesToUser(ImmutableList.of("role1"),
NORMAL_USER);
client
@@ -70,7 +70,7 @@ public class RoleAuthorizationIT extends
BaseRestApiAuthorizationIT {
String[] roleNames = client.loadMetalake(METALAKE).listRoleNames();
assertArrayEquals(new String[] {"role1", "role2", "role3", "role4"},
roleNames);
roleNames = normalUserClient.loadMetalake(METALAKE).listRoleNames();
- assertArrayEquals(new String[] {"role1"}, roleNames);
+ assertArrayEquals(new String[] {"role1", "role4"}, roleNames);
}
@Test
@@ -94,12 +94,6 @@ public class RoleAuthorizationIT extends
BaseRestApiAuthorizationIT {
() -> {
normalUserClient.loadMetalake(METALAKE).getRole("role3");
});
- assertThrows(
- "Current user can not create role.",
- RuntimeException.class,
- () -> {
- normalUserClient.loadMetalake(METALAKE).getRole("role4");
- });
}
@Test
@@ -124,17 +118,10 @@ public class RoleAuthorizationIT extends
BaseRestApiAuthorizationIT {
() -> {
normalUserClient.loadMetalake(METALAKE).deleteRole("role3");
});
- assertThrows(
- "Current user can not create role.",
- RuntimeException.class,
- () -> {
- normalUserClient.loadMetalake(METALAKE).deleteRole("role4");
- });
// owner can delete role
client.loadMetalake(METALAKE).deleteRole("role1");
client.loadMetalake(METALAKE).deleteRole("role2");
client.loadMetalake(METALAKE).deleteRole("role3");
- client.loadMetalake(METALAKE).deleteRole("role4");
// normal user can not create role after delete role
assertThrows(
"Current user can not create role.",
diff --git
a/server-common/src/main/java/org/apache/gravitino/server/authorization/MetadataIdConverter.java
b/server-common/src/main/java/org/apache/gravitino/server/authorization/MetadataIdConverter.java
index e7deaa15b0..4143477bd2 100644
---
a/server-common/src/main/java/org/apache/gravitino/server/authorization/MetadataIdConverter.java
+++
b/server-common/src/main/java/org/apache/gravitino/server/authorization/MetadataIdConverter.java
@@ -24,7 +24,6 @@ import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
import java.io.IOException;
import java.util.Map;
-import java.util.regex.Pattern;
import org.apache.gravitino.Entity;
import org.apache.gravitino.EntityStore;
import org.apache.gravitino.GravitinoEnv;
@@ -46,10 +45,11 @@ import org.apache.gravitino.meta.TableEntity;
import org.apache.gravitino.meta.TagEntity;
import org.apache.gravitino.meta.TopicEntity;
import org.apache.gravitino.meta.UserEntity;
+import org.apache.gravitino.utils.MetadataObjectUtil;
/** It is used to convert MetadataObject to MetadataId */
public class MetadataIdConverter {
- private static final Pattern DOT_PATTERN = Pattern.compile("\\.");
+
// Maps metadata type to entity type
private static final Map<MetadataObject.Type, Entity.EntityType>
METADATA_TO_ENTITY_TYPE_MAPPING =
ImmutableMap.of(
@@ -104,10 +104,7 @@ public class MetadataIdConverter {
CatalogManager catalogManager =
GravitinoEnv.getInstance().catalogManager();
MetadataObject.Type metadataType = metadataObject.type();
- NameIdentifier ident =
- (metadataType != MetadataObject.Type.METALAKE)
- ? NameIdentifier.of(DOT_PATTERN.split(metalake + "." +
metadataObject.fullName()))
- : NameIdentifier.of(metadataObject.fullName());
+ NameIdentifier ident = MetadataObjectUtil.toEntityIdent(metalake,
metadataObject);
NameIdentifier normalizedIdent =
normalizeCaseSensitive(ident,
METADATA_SCOPE_MAPPING.get(metadataType), catalogManager);
diff --git
a/server-common/src/main/java/org/apache/gravitino/server/authorization/jcasbin/JcasbinAuthorizer.java
b/server-common/src/main/java/org/apache/gravitino/server/authorization/jcasbin/JcasbinAuthorizer.java
index 86a36b9897..8ec23469f5 100644
---
a/server-common/src/main/java/org/apache/gravitino/server/authorization/jcasbin/JcasbinAuthorizer.java
+++
b/server-common/src/main/java/org/apache/gravitino/server/authorization/jcasbin/JcasbinAuthorizer.java
@@ -154,14 +154,7 @@ public class JcasbinAuthorizer implements
GravitinoAuthorizer {
try {
Long roleId =
MetadataIdConverter.getID(
- MetadataObjects.of(
- String.join(
- ".",
- nameIdentifier.namespace().level(1),
- nameIdentifier.namespace().level(2)),
- nameIdentifier.name(),
- MetadataObject.Type.ROLE),
- metalake);
+ NameIdentifierUtil.toMetadataObject(nameIdentifier, type),
metalake);
UserEntity userEntity = getUserEntity(currentUserName, metalake);
Long userId = userEntity.id();
loadRolePrivilege(metalake, currentUserName, userId);
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/OwnerOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/OwnerOperations.java
index 67fe25ff21..264ba8a2b9 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/OwnerOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/OwnerOperations.java
@@ -32,6 +32,7 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
+import org.apache.gravitino.Entity;
import org.apache.gravitino.GravitinoEnv;
import org.apache.gravitino.MetadataObject;
import org.apache.gravitino.MetadataObjects;
@@ -44,6 +45,7 @@ import org.apache.gravitino.dto.util.DTOConverters;
import org.apache.gravitino.metrics.MetricNames;
import org.apache.gravitino.server.authorization.NameBindings;
import
org.apache.gravitino.server.authorization.annotations.AuthorizationExpression;
+import
org.apache.gravitino.server.authorization.annotations.AuthorizationMetadata;
import org.apache.gravitino.server.web.Utils;
import org.apache.gravitino.utils.MetadataObjectUtil;
@@ -97,9 +99,12 @@ public class OwnerOperations {
@Produces("application/vnd.gravitino.v1+json")
@Timed(name = "set-object-owner." + MetricNames.HTTP_PROCESS_DURATION,
absolute = true)
@ResponseMetered(name = "set-object-owner", absolute = true)
- @AuthorizationExpression(expression = CAN_SET_OWNER)
+ @AuthorizationExpression(
+ expression = CAN_SET_OWNER,
+ errorMessage = "Current user can not set this objects's owner")
public Response setOwnerForObject(
- @PathParam("metalake") String metalake,
+ @PathParam("metalake") @AuthorizationMetadata(type =
Entity.EntityType.METALAKE)
+ String metalake,
@PathParam("metadataObjectType") String metadataObjectType,
@PathParam("fullName") String fullName,
OwnerSetRequest request) {