Skip to content

Commit 89396e0

Browse files
authored
[#5892] fix(auth): Fix to grant privilege for the metalake (#5919)
### What changes were proposed in this pull request? Fix to grant privilege for the metalake ### Why are the changes needed? Fix: #5892 ### Does this PR introduce _any_ user-facing change? No. ### How was this patch tested? Add a UT.
1 parent 86e8441 commit 89396e0

File tree

4 files changed

+51
-9
lines changed

4 files changed

+51
-9
lines changed

authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerBaseE2EIT.java

+33
Original file line numberDiff line numberDiff line change
@@ -984,4 +984,37 @@ void testDenyPrivileges() throws InterruptedException {
984984
catalog.asSchemas().dropSchema(schemaName, false);
985985
metalake.deleteRole(roleName);
986986
}
987+
988+
// ISSUE-5892 Fix to grant privilege for the metalake
989+
@Test
990+
void testGrantPrivilegesForMetalake() throws InterruptedException {
991+
// Choose a catalog
992+
useCatalog();
993+
994+
// Create a schema
995+
String roleName = currentFunName();
996+
metalake.createRole(roleName, Collections.emptyMap(), Collections.emptyList());
997+
998+
// Grant a create schema privilege
999+
metalake.grantPrivilegesToRole(
1000+
roleName,
1001+
MetadataObjects.of(null, metalakeName, MetadataObject.Type.METALAKE),
1002+
Lists.newArrayList(Privileges.CreateSchema.allow()));
1003+
1004+
// Fail to create a schema
1005+
Assertions.assertThrows(
1006+
AccessControlException.class, () -> sparkSession.sql(SQL_CREATE_SCHEMA));
1007+
1008+
// Granted this role to the spark execution user `HADOOP_USER_NAME`
1009+
String userName1 = System.getenv(HADOOP_USER_NAME);
1010+
metalake.grantRolesToUser(Lists.newArrayList(roleName), userName1);
1011+
1012+
waitForUpdatingPolicies();
1013+
1014+
Assertions.assertDoesNotThrow(() -> sparkSession.sql(SQL_CREATE_SCHEMA));
1015+
1016+
// Clean up
1017+
catalog.asSchemas().dropSchema(schemaName, false);
1018+
metalake.deleteRole(roleName);
1019+
}
9871020
}

core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java

+10-3
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,11 @@ public static void callAuthorizationPluginForMetadataObject(
173173
String metalake, MetadataObject metadataObject, Consumer<AuthorizationPlugin> consumer) {
174174
CatalogManager catalogManager = GravitinoEnv.getInstance().catalogManager();
175175
if (needApplyAuthorizationPluginAllCatalogs(metadataObject.type())) {
176-
Catalog[] catalogs = catalogManager.listCatalogsInfo(Namespace.of(metalake));
177-
for (Catalog catalog : catalogs) {
178-
callAuthorizationPluginImpl(consumer, catalog);
176+
NameIdentifier[] catalogs = catalogManager.listCatalogs(Namespace.of(metalake));
177+
// ListCatalogsInfo return `CatalogInfo` instead of `BaseCatalog`, we need `BaseCatalog` to
178+
// call authorization plugin method.
179+
for (NameIdentifier catalog : catalogs) {
180+
callAuthorizationPluginImpl(consumer, catalogManager.loadCatalog(catalog));
179181
}
180182
} else if (needApplyAuthorization(metadataObject.type())) {
181183
NameIdentifier catalogIdent =
@@ -269,6 +271,11 @@ private static void callAuthorizationPluginImpl(
269271
if (baseCatalog.getAuthorizationPlugin() != null) {
270272
consumer.accept(baseCatalog.getAuthorizationPlugin());
271273
}
274+
} else {
275+
throw new IllegalArgumentException(
276+
String.format(
277+
"Catalog %s is not a BaseCatalog, we don't support authorization plugin for it",
278+
catalog.type()));
272279
}
273280
}
274281

core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManagerForPermissions.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@
2828
import java.time.Instant;
2929
import java.util.List;
3030
import org.apache.commons.lang3.reflect.FieldUtils;
31-
import org.apache.gravitino.Catalog;
3231
import org.apache.gravitino.Config;
3332
import org.apache.gravitino.Configs;
3433
import org.apache.gravitino.Entity;
3534
import org.apache.gravitino.EntityStore;
3635
import org.apache.gravitino.GravitinoEnv;
3736
import org.apache.gravitino.MetadataObject;
3837
import org.apache.gravitino.MetadataObjects;
38+
import org.apache.gravitino.NameIdentifier;
3939
import org.apache.gravitino.Namespace;
4040
import org.apache.gravitino.catalog.CatalogManager;
4141
import org.apache.gravitino.connector.BaseCatalog;
@@ -172,8 +172,8 @@ public static void setUp() throws Exception {
172172
FieldUtils.writeField(GravitinoEnv.getInstance(), "catalogManager", catalogManager, true);
173173
BaseCatalog catalog = Mockito.mock(BaseCatalog.class);
174174
Mockito.when(catalogManager.loadCatalog(any())).thenReturn(catalog);
175-
Mockito.when(catalogManager.listCatalogsInfo(Mockito.any()))
176-
.thenReturn(new Catalog[] {catalog});
175+
Mockito.when(catalogManager.listCatalogs(Mockito.any()))
176+
.thenReturn(new NameIdentifier[] {NameIdentifier.of("metalake", "catalog")});
177177
authorizationPlugin = Mockito.mock(AuthorizationPlugin.class);
178178
Mockito.when(catalog.getAuthorizationPlugin()).thenReturn(authorizationPlugin);
179179
}

core/src/test/java/org/apache/gravitino/authorization/TestOwnerManager.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import static org.apache.gravitino.Configs.TREE_LOCK_MAX_NODE_IN_MEMORY;
3232
import static org.apache.gravitino.Configs.TREE_LOCK_MIN_NODE_IN_MEMORY;
3333
import static org.apache.gravitino.Configs.VERSION_RETENTION_COUNT;
34+
import static org.mockito.ArgumentMatchers.any;
3435

3536
import com.google.common.collect.Lists;
3637
import java.io.File;
@@ -40,13 +41,13 @@
4041
import java.util.UUID;
4142
import org.apache.commons.io.FileUtils;
4243
import org.apache.commons.lang3.reflect.FieldUtils;
43-
import org.apache.gravitino.Catalog;
4444
import org.apache.gravitino.Config;
4545
import org.apache.gravitino.EntityStore;
4646
import org.apache.gravitino.EntityStoreFactory;
4747
import org.apache.gravitino.GravitinoEnv;
4848
import org.apache.gravitino.MetadataObject;
4949
import org.apache.gravitino.MetadataObjects;
50+
import org.apache.gravitino.NameIdentifier;
5051
import org.apache.gravitino.catalog.CatalogManager;
5152
import org.apache.gravitino.connector.BaseCatalog;
5253
import org.apache.gravitino.connector.authorization.AuthorizationPlugin;
@@ -145,8 +146,9 @@ public static void setUp() throws IOException, IllegalAccessException {
145146

146147
ownerManager = new OwnerManager(entityStore);
147148
BaseCatalog catalog = Mockito.mock(BaseCatalog.class);
148-
Mockito.when(catalogManager.listCatalogsInfo(Mockito.any()))
149-
.thenReturn(new Catalog[] {catalog});
149+
Mockito.when(catalogManager.loadCatalog(any())).thenReturn(catalog);
150+
Mockito.when(catalogManager.listCatalogs(Mockito.any()))
151+
.thenReturn(new NameIdentifier[] {NameIdentifier.of("metalake", "catalog")});
150152
Mockito.when(catalog.getAuthorizationPlugin()).thenReturn(authorizationPlugin);
151153
}
152154

0 commit comments

Comments
 (0)