This is an automated email from the ASF dual-hosted git repository.
mchades 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 10d51bd966 [#12594][followup] fix(authz): Clarify semantic model
privilege naming and filtering (#13718)
10d51bd966 is described below
commit 10d51bd966af6cf4d3cdebc6290de4def9f0b35c
Author: Akshay Thorat <[email protected]>
AuthorDate: Fri Oct 9 07:52:47 2026 -0700
[#12594][followup] fix(authz): Clarify semantic model privilege naming and
filtering (#13718)
### What changes were proposed in this pull request?
Rename the unreleased `SELECT_SEMANTIC_MODEL` privilege and
`Privileges.SelectSemanticModel` helper to `USE_SEMANTIC_MODEL` and
`Privileges.UseSemanticModel`, retaining the same permission bit.
Add `SKIP_APPLY_PRIVILEGES` for connector callback selection and
privilege filtering, separate from the semantic-model privilege set used
for catalog-type validation. Update authorization expressions, OpenAPI,
documentation, and tests.
### Why are the changes needed?
Addresses the post-merge review on #12867: align the privilege name with
`USE_MODEL` and give connector exclusions a dedicated constant that can
include other privileges.
Fix: #12594.
### Does this PR introduce _any_ user-facing change?
Clients use `USE_SEMANTIC_MODEL` and `Privileges.UseSemanticModel`. The
old names are removed because they have not been released. The privilege
still covers discovery and loading definitions, without authorizing
access to underlying source data.
### How was this patch tested?
- 80 focused tests passed on JDK 17 across API, core, server-common, and
server. Coverage includes privilege parsing and binding, H2 persistence,
mixed connector grants, and authorization expressions.
- `./gradlew spotlessApply`, `./gradlew :docs:build`, and
API/core/server-common Javadoc tasks passed. Javadoc emitted existing
warnings in unrelated files.
- Standards and specification reviews found no actionable issues.
Docker integration suites were not run.
---
.../apache/gravitino/authorization/Privilege.java | 2 +-
.../apache/gravitino/authorization/Privileges.java | 24 ++++++-------
.../authorization/TestSecurableObjects.java | 42 ++++++++++++++--------
.../authorization/AuthorizationUtils.java | 8 +++--
.../TestAccessControlManagerForPermissions.java | 2 +-
.../authorization/TestAuthorizationUtils.java | 2 +-
.../authorization/TestFutureGrantManager.java | 4 +--
.../relational/TestSemanticModelJDBCBackend.java | 6 ++--
design-docs/gravitino-semantic-model-design.md | 4 +--
docs/open-api/roles.yaml | 2 +-
docs/security/access-control.md | 4 +--
.../AuthorizationExpressionConstants.java | 6 ++--
.../AuthorizationExpressionConverter.java | 6 ++--
.../TestSemanticModelAuthorizationExpression.java | 21 ++++++-----
14 files changed, 74 insertions(+), 59 deletions(-)
diff --git
a/api/src/main/java/org/apache/gravitino/authorization/Privilege.java
b/api/src/main/java/org/apache/gravitino/authorization/Privilege.java
index 110468adc2..083435cffa 100644
--- a/api/src/main/java/org/apache/gravitino/authorization/Privilege.java
+++ b/api/src/main/java/org/apache/gravitino/authorization/Privilege.java
@@ -175,7 +175,7 @@ public interface Privilege {
/** The privilege to create a semantic model. */
CREATE_SEMANTIC_MODEL(0L, 1L << 39),
/** The privilege to discover a semantic model and load its definition. */
- SELECT_SEMANTIC_MODEL(0L, 1L << 40),
+ USE_SEMANTIC_MODEL(0L, 1L << 40),
/** The privilege to rename a semantic model or alter its definition and
metadata. */
MODIFY_SEMANTIC_MODEL(0L, 1L << 41);
diff --git
a/api/src/main/java/org/apache/gravitino/authorization/Privileges.java
b/api/src/main/java/org/apache/gravitino/authorization/Privileges.java
index 211b8c6754..95a15b6b7b 100644
--- a/api/src/main/java/org/apache/gravitino/authorization/Privileges.java
+++ b/api/src/main/java/org/apache/gravitino/authorization/Privileges.java
@@ -251,8 +251,8 @@ public class Privileges {
// Semantic model
case CREATE_SEMANTIC_MODEL:
return CreateSemanticModel.allow();
- case SELECT_SEMANTIC_MODEL:
- return SelectSemanticModel.allow();
+ case USE_SEMANTIC_MODEL:
+ return UseSemanticModel.allow();
case MODIFY_SEMANTIC_MODEL:
return ModifySemanticModel.allow();
@@ -395,8 +395,8 @@ public class Privileges {
// Semantic model
case CREATE_SEMANTIC_MODEL:
return CreateSemanticModel.deny();
- case SELECT_SEMANTIC_MODEL:
- return SelectSemanticModel.deny();
+ case USE_SEMANTIC_MODEL:
+ return UseSemanticModel.deny();
case MODIFY_SEMANTIC_MODEL:
return ModifySemanticModel.deny();
@@ -1770,27 +1770,27 @@ public class Privileges {
}
/** The privilege to discover a semantic model and load its definition. */
- public static class SelectSemanticModel extends
GenericPrivilege<SelectSemanticModel> {
- private static final SelectSemanticModel ALLOW_INSTANCE =
- new SelectSemanticModel(Condition.ALLOW, Name.SELECT_SEMANTIC_MODEL);
- private static final SelectSemanticModel DENY_INSTANCE =
- new SelectSemanticModel(Condition.DENY, Name.SELECT_SEMANTIC_MODEL);
+ public static class UseSemanticModel extends
GenericPrivilege<UseSemanticModel> {
+ private static final UseSemanticModel ALLOW_INSTANCE =
+ new UseSemanticModel(Condition.ALLOW, Name.USE_SEMANTIC_MODEL);
+ private static final UseSemanticModel DENY_INSTANCE =
+ new UseSemanticModel(Condition.DENY, Name.USE_SEMANTIC_MODEL);
- private SelectSemanticModel(Condition condition, Name name) {
+ private UseSemanticModel(Condition condition, Name name) {
super(condition, name);
}
/**
* @return The instance with allow condition of the privilege.
*/
- public static SelectSemanticModel allow() {
+ public static UseSemanticModel allow() {
return ALLOW_INSTANCE;
}
/**
* @return The instance with deny condition of the privilege.
*/
- public static SelectSemanticModel deny() {
+ public static UseSemanticModel deny() {
return DENY_INSTANCE;
}
diff --git
a/api/src/test/java/org/apache/gravitino/authorization/TestSecurableObjects.java
b/api/src/test/java/org/apache/gravitino/authorization/TestSecurableObjects.java
index 86984a5917..acf9b93e39 100644
---
a/api/src/test/java/org/apache/gravitino/authorization/TestSecurableObjects.java
+++
b/api/src/test/java/org/apache/gravitino/authorization/TestSecurableObjects.java
@@ -114,7 +114,7 @@ public class TestSecurableObjects {
SecurableObject semanticModel =
SecurableObjects.ofSemanticModel(
- schema, "sales_model",
Lists.newArrayList(Privileges.SelectSemanticModel.allow()));
+ schema, "sales_model",
Lists.newArrayList(Privileges.UseSemanticModel.allow()));
Assertions.assertEquals("catalog.schema.sales_model",
semanticModel.fullName());
Assertions.assertEquals(MetadataObject.Type.SEMANTIC_MODEL,
semanticModel.type());
@@ -122,7 +122,7 @@ public class TestSecurableObjects {
SecurableObjects.of(
MetadataObject.Type.SEMANTIC_MODEL,
Lists.newArrayList("catalog", "schema", "sales_model"),
- Lists.newArrayList(Privileges.SelectSemanticModel.allow()));
+ Lists.newArrayList(Privileges.UseSemanticModel.allow()));
Assertions.assertEquals(semanticModel, anotherSemanticModel);
Exception e =
@@ -199,7 +199,7 @@ public class TestSecurableObjects {
SecurableObjects.of(
MetadataObject.Type.SEMANTIC_MODEL,
Lists.newArrayList("metalake"),
-
Lists.newArrayList(Privileges.SelectSemanticModel.allow())));
+ Lists.newArrayList(Privileges.UseSemanticModel.allow())));
Assertions.assertTrue(e.getMessage().contains("the length of names must be
3"));
}
@@ -241,7 +241,7 @@ public class TestSecurableObjects {
Privilege executeFunction = Privileges.ExecuteFunction.allow();
Privilege modifyFunction = Privileges.ModifyFunction.allow();
Privilege createSemanticModel = Privileges.CreateSemanticModel.allow();
- Privilege selectSemanticModel = Privileges.SelectSemanticModel.allow();
+ Privilege useSemanticModel = Privileges.UseSemanticModel.allow();
Privilege modifySemanticModel = Privileges.ModifySemanticModel.allow();
Privilege useSecrets = Privileges.UseSecrets.allow();
Privilege includeCredentialSecrets =
Privileges.IncludeCredentialSecrets.allow();
@@ -624,15 +624,15 @@ public class TestSecurableObjects {
Assertions.assertFalse(createSemanticModel.canBindTo(MetadataObject.Type.ROLE));
Assertions.assertFalse(createSemanticModel.canBindTo(MetadataObject.Type.COLUMN));
- // Test select semantic model
-
Assertions.assertTrue(selectSemanticModel.canBindTo(MetadataObject.Type.METALAKE));
-
Assertions.assertTrue(selectSemanticModel.canBindTo(MetadataObject.Type.CATALOG));
-
Assertions.assertTrue(selectSemanticModel.canBindTo(MetadataObject.Type.SCHEMA));
-
Assertions.assertTrue(selectSemanticModel.canBindTo(MetadataObject.Type.SEMANTIC_MODEL));
-
Assertions.assertFalse(selectSemanticModel.canBindTo(MetadataObject.Type.TABLE));
-
Assertions.assertFalse(selectSemanticModel.canBindTo(MetadataObject.Type.MODEL));
-
Assertions.assertFalse(selectSemanticModel.canBindTo(MetadataObject.Type.ROLE));
-
Assertions.assertFalse(selectSemanticModel.canBindTo(MetadataObject.Type.COLUMN));
+ // Test use semantic model
+
Assertions.assertTrue(useSemanticModel.canBindTo(MetadataObject.Type.METALAKE));
+
Assertions.assertTrue(useSemanticModel.canBindTo(MetadataObject.Type.CATALOG));
+
Assertions.assertTrue(useSemanticModel.canBindTo(MetadataObject.Type.SCHEMA));
+
Assertions.assertTrue(useSemanticModel.canBindTo(MetadataObject.Type.SEMANTIC_MODEL));
+
Assertions.assertFalse(useSemanticModel.canBindTo(MetadataObject.Type.TABLE));
+
Assertions.assertFalse(useSemanticModel.canBindTo(MetadataObject.Type.MODEL));
+
Assertions.assertFalse(useSemanticModel.canBindTo(MetadataObject.Type.ROLE));
+
Assertions.assertFalse(useSemanticModel.canBindTo(MetadataObject.Type.COLUMN));
// Test modify semantic model
Assertions.assertTrue(modifySemanticModel.canBindTo(MetadataObject.Type.METALAKE));
@@ -646,7 +646,7 @@ public class TestSecurableObjects {
// Deny instances must agree with their allow counterparts on binding
Assertions.assertTrue(
-
Privileges.SelectSemanticModel.deny().canBindTo(MetadataObject.Type.SEMANTIC_MODEL));
+
Privileges.UseSemanticModel.deny().canBindTo(MetadataObject.Type.SEMANTIC_MODEL));
Assertions.assertEquals(
Privilege.Condition.DENY,
Privileges.ModifySemanticModel.deny().condition());
Assertions.assertEquals(
@@ -657,6 +657,20 @@ public class TestSecurableObjects {
Privileges.deny(Privilege.Name.MODIFY_SEMANTIC_MODEL));
}
+ @Test
+ public void testUseSemanticModelPrivilege() {
+ Assertions.assertEquals(
+ Privileges.UseSemanticModel.allow(),
Privileges.allow("USE_SEMANTIC_MODEL"));
+ Assertions.assertEquals(
+ Privileges.UseSemanticModel.deny(),
Privileges.deny("USE_SEMANTIC_MODEL"));
+ Assertions.assertEquals(
+ "ALLOW use semantic model",
Privileges.UseSemanticModel.allow().simpleString());
+ Assertions.assertEquals(
+ "DENY use semantic model",
Privileges.UseSemanticModel.deny().simpleString());
+ Assertions.assertEquals(1L << 40,
Privilege.Name.USE_SEMANTIC_MODEL.getLowBits());
+ Assertions.assertEquals(0L,
Privilege.Name.USE_SEMANTIC_MODEL.getHighBits());
+ }
+
@Test
public void testHashCodeConsistentWithUnorderedPrivileges() {
SecurableObject one =
diff --git
a/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java
b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java
index 1335f7e46a..1bf888d74e 100644
---
a/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java
+++
b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java
@@ -126,9 +126,11 @@ public class AuthorizationUtils {
private static final Set<Privilege.Name> SEMANTIC_MODEL_PRIVILEGES =
Sets.immutableEnumSet(
Privilege.Name.CREATE_SEMANTIC_MODEL,
- Privilege.Name.SELECT_SEMANTIC_MODEL,
+ Privilege.Name.USE_SEMANTIC_MODEL,
Privilege.Name.MODIFY_SEMANTIC_MODEL);
+ private static final Set<Privilege.Name> SKIP_APPLY_PRIVILEGES =
SEMANTIC_MODEL_PRIVILEGES;
+
private AuthorizationUtils() {}
public static void checkCurrentUser(String metalake, String user) {
@@ -266,7 +268,7 @@ public class AuthorizationUtils {
if (securableObject.type() == MetadataObject.Type.METALAKE) {
List<Privilege> privileges = securableObject.privileges();
for (Privilege privilege : privileges) {
- if (!SEMANTIC_MODEL_PRIVILEGES.contains(privilege.name())
+ if (!SKIP_APPLY_PRIVILEGES.contains(privilege.name())
&& privilege.canBindTo(MetadataObject.Type.CATALOG)) {
return true;
}
@@ -556,7 +558,7 @@ public class AuthorizationUtils {
return List.of();
}
return object.privileges().stream()
- .filter(privilege ->
!SEMANTIC_MODEL_PRIVILEGES.contains(privilege.name()))
+ .filter(privilege -> !SKIP_APPLY_PRIVILEGES.contains(privilege.name()))
.collect(Collectors.toList());
}
diff --git
a/core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManagerForPermissions.java
b/core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManagerForPermissions.java
index 5b4f55c4c0..cff2ad57c9 100644
---
a/core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManagerForPermissions.java
+++
b/core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManagerForPermissions.java
@@ -472,7 +472,7 @@ public class TestAccessControlManagerForPermissions {
.build(),
false);
PermissionManager manager = new PermissionManager(entityStore,
Mockito.mock(RoleManager.class));
- Privilege semantic = Privileges.SelectSemanticModel.allow();
+ Privilege semantic = Privileges.UseSemanticModel.allow();
Privilege table = Privileges.SelectTable.allow();
SecurableObject tableObject = SecurableObjects.parse(fullName, type,
List.of(table));
SecurableObject semanticObject = SecurableObjects.parse(fullName, type,
List.of(semantic));
diff --git
a/core/src/test/java/org/apache/gravitino/authorization/TestAuthorizationUtils.java
b/core/src/test/java/org/apache/gravitino/authorization/TestAuthorizationUtils.java
index 611b9c47dd..db05fb9d04 100644
---
a/core/src/test/java/org/apache/gravitino/authorization/TestAuthorizationUtils.java
+++
b/core/src/test/java/org/apache/gravitino/authorization/TestAuthorizationUtils.java
@@ -543,7 +543,7 @@ class TestAuthorizationUtils {
for (Privilege semantic :
List.of(
Privileges.CreateSemanticModel.allow(),
- Privileges.SelectSemanticModel.deny(),
+ Privileges.UseSemanticModel.deny(),
Privileges.ModifySemanticModel.allow())) {
SecurableObject semanticOnly = SecurableObjects.parse(name, type,
List.of(semantic));
AuthorizationUtils.callAuthorizationPluginForSecurableObjects(
diff --git
a/core/src/test/java/org/apache/gravitino/authorization/TestFutureGrantManager.java
b/core/src/test/java/org/apache/gravitino/authorization/TestFutureGrantManager.java
index a7c884235c..174e9e1346 100644
---
a/core/src/test/java/org/apache/gravitino/authorization/TestFutureGrantManager.java
+++
b/core/src/test/java/org/apache/gravitino/authorization/TestFutureGrantManager.java
@@ -207,12 +207,12 @@ public class TestFutureGrantManager {
SecurableObjects.ofMetalake(
METALAKE,
Lists.newArrayList(
- Privileges.SelectTable.allow(),
Privileges.SelectSemanticModel.allow()));
+ Privileges.SelectTable.allow(),
Privileges.UseSemanticModel.allow()));
SecurableObject semanticModel =
SecurableObjects.parse(
"old_catalog.schema.model",
MetadataObject.Type.SEMANTIC_MODEL,
- Lists.newArrayList(Privileges.SelectSemanticModel.allow()));
+ Lists.newArrayList(Privileges.UseSemanticModel.allow()));
SecurableObject otherTable =
SecurableObjects.parse(
"old_catalog.schema.table",
diff --git
a/core/src/test/java/org/apache/gravitino/storage/relational/TestSemanticModelJDBCBackend.java
b/core/src/test/java/org/apache/gravitino/storage/relational/TestSemanticModelJDBCBackend.java
index 6fd96679c3..0ba494234e 100644
---
a/core/src/test/java/org/apache/gravitino/storage/relational/TestSemanticModelJDBCBackend.java
+++
b/core/src/test/java/org/apache/gravitino/storage/relational/TestSemanticModelJDBCBackend.java
@@ -100,7 +100,7 @@ public class TestSemanticModelJDBCBackend extends
TestJDBCBackend {
semanticModelRole(
model,
List.of(
- Privileges.SelectSemanticModel.allow(),
+ Privileges.UseSemanticModel.allow(),
Privileges.ModifySemanticModel.allow(),
Privileges.ManageGrants.allow()));
backend.insert(role, false);
@@ -125,7 +125,7 @@ public class TestSemanticModelJDBCBackend extends
TestJDBCBackend {
.withAuditInfo(AUDIT_INFO)
.withProperties(ImmutableMap.of())
.withSecurableObjects(
- semanticModelRole(renamed,
List.of(Privileges.SelectSemanticModel.allow()))
+ semanticModelRole(renamed,
List.of(Privileges.UseSemanticModel.allow()))
.securableObjects())
.build());
loaded = backend.get(role.nameIdentifier(), Entity.EntityType.ROLE);
@@ -173,7 +173,7 @@ public class TestSemanticModelJDBCBackend extends
TestJDBCBackend {
.getOwner(entity.nameIdentifier(), entity.type())
.orElseThrow());
backend.insert(
- semanticModelRole(entity,
List.of(Privileges.SelectSemanticModel.allow())), false);
+ semanticModelRole(entity,
List.of(Privileges.UseSemanticModel.allow())), false);
}
assertEquals(
0,
diff --git a/design-docs/gravitino-semantic-model-design.md
b/design-docs/gravitino-semantic-model-design.md
index 44abd65927..af2319d165 100644
--- a/design-docs/gravitino-semantic-model-design.md
+++ b/design-docs/gravitino-semantic-model-design.md
@@ -640,13 +640,13 @@ Semantic Models are new securable metadata objects. The
design introduces:
| Privilege | Purpose |
|-------------------------|---------------------------------------------------|
| `CREATE_SEMANTIC_MODEL` | Create a Semantic Model under a schema |
-| `SELECT_SEMANTIC_MODEL` | Discover and load the model definition |
+| `USE_SEMANTIC_MODEL` | Discover and load the model definition |
| `MODIFY_SEMANTIC_MODEL` | Rename or alter the model definition and metadata |
- **Create.** A metalake or catalog owner may create directly; a schema owner
also requires
`USE_CATALOG`; otherwise, the caller requires `USE_CATALOG`, `USE_SCHEMA`,
and
`CREATE_SEMANTIC_MODEL`.
-- **List and load.** Return only models on which the caller has
`SELECT_SEMANTIC_MODEL`,
+- **List and load.** Return only models on which the caller has
`USE_SEMANTIC_MODEL`,
`MODIFY_SEMANTIC_MODEL`, or ownership.
- **Alter.** Requires `MODIFY_SEMANTIC_MODEL` or ownership.
- **Drop.** A metalake or catalog owner may drop directly; a schema owner also
requires
diff --git a/docs/open-api/roles.yaml b/docs/open-api/roles.yaml
index cbbbdca4df..411176b3f1 100644
--- a/docs/open-api/roles.yaml
+++ b/docs/open-api/roles.yaml
@@ -233,7 +233,7 @@ components:
- CREATE_VIEW
- SELECT_VIEW
- CREATE_SEMANTIC_MODEL
- - SELECT_SEMANTIC_MODEL
+ - USE_SEMANTIC_MODEL
- MODIFY_SEMANTIC_MODEL
description: The name of the privilege
condition:
diff --git a/docs/security/access-control.md b/docs/security/access-control.md
index 8d59605c59..37deeb5d4d 100755
--- a/docs/security/access-control.md
+++ b/docs/security/access-control.md
@@ -209,7 +209,7 @@ sets the scope of the grant. Binding a privilege to a type
not listed for it is
| `EXECUTE_FUNCTION` | Metalake, Catalog, Schema, Function
| Read the metadata of, and execute, any function in
scope |
| `MODIFY_FUNCTION` | Metalake, Catalog, Schema, Function
| Alter or drop any function in scope
|
| `CREATE_SEMANTIC_MODEL` | Metalake, Catalog, Schema | Create
semantic models in any schema in scope |
-| `SELECT_SEMANTIC_MODEL` | Metalake, Catalog, Schema, Semantic Model |
Discover and load the definition of any semantic model in scope |
+| `USE_SEMANTIC_MODEL` | Metalake, Catalog, Schema, Semantic Model | Discover
and load the definition of any semantic model in scope |
| `MODIFY_SEMANTIC_MODEL` | Metalake, Catalog, Schema, Semantic Model |
Rename, and alter the definition and metadata of, any semantic model in scope |
Either `SELECT_TABLE` or `MODIFY_TABLE` is enough to load a table's metadata.
Topics and filesets
@@ -281,7 +281,7 @@ return only the entries the caller is entitled to see,
which for a metalake owne
| Fileset | `CREATE_FILESET` | `READ_FILESET` or `WRITE_FILESET` |
`WRITE_FILESET` | Owner |
| Model | `REGISTER_MODEL` | `USE_MODEL` |
Owner | Owner |
| Function | `REGISTER_FUNCTION` | `EXECUTE_FUNCTION` or `MODIFY_FUNCTION` |
`MODIFY_FUNCTION` | Owner |
-| Semantic Model | `CREATE_SEMANTIC_MODEL` | `SELECT_SEMANTIC_MODEL` or
`MODIFY_SEMANTIC_MODEL` | `MODIFY_SEMANTIC_MODEL` | Owner |
+| Semantic Model | `CREATE_SEMANTIC_MODEL` | `USE_SEMANTIC_MODEL` or
`MODIFY_SEMANTIC_MODEL` | `MODIFY_SEMANTIC_MODEL` | Owner |
Testing a catalog connection follows the catalog row. Testing a catalog before
it is created takes
`CREATE_CATALOG`. Testing an existing catalog with its stored configuration
takes `USE_CATALOG`, the
diff --git
a/server-common/src/main/java/org/apache/gravitino/server/authorization/expression/AuthorizationExpressionConstants.java
b/server-common/src/main/java/org/apache/gravitino/server/authorization/expression/AuthorizationExpressionConstants.java
index d1c227b559..d32f83bb06 100644
---
a/server-common/src/main/java/org/apache/gravitino/server/authorization/expression/AuthorizationExpressionConstants.java
+++
b/server-common/src/main/java/org/apache/gravitino/server/authorization/expression/AuthorizationExpressionConstants.java
@@ -315,7 +315,7 @@ public class AuthorizationExpressionConstants {
""";
/**
- * Semantic Model list and load. Only Semantic Models the caller can select,
modify, or owns are
+ * Semantic Model list and load. Only Semantic Models the caller can use,
modify, or owns are
* returned; a metalake or catalog owner, or a schema owner holding
USE_CATALOG, sees them all.
*/
public static final String LOAD_SEMANTIC_MODEL_AUTHORIZATION_EXPRESSION =
@@ -323,7 +323,7 @@ public class AuthorizationExpressionConstants {
ANY(OWNER, METALAKE, CATALOG) ||
SCHEMA_OWNER_WITH_USE_CATALOG ||
ANY_USE_CATALOG && ANY_USE_SCHEMA &&
- (SEMANTIC_MODEL::OWNER || ANY_SELECT_SEMANTIC_MODEL ||
ANY_MODIFY_SEMANTIC_MODEL)
+ (SEMANTIC_MODEL::OWNER || ANY_USE_SEMANTIC_MODEL ||
ANY_MODIFY_SEMANTIC_MODEL)
""";
/** Semantic Model creation under a schema. */
@@ -357,7 +357,7 @@ public class AuthorizationExpressionConstants {
public static final String FILTER_SEMANTIC_MODEL_AUTHORIZATION_EXPRESSION =
"""
ANY(OWNER, METALAKE, CATALOG, SCHEMA, SEMANTIC_MODEL) ||
- ANY_SELECT_SEMANTIC_MODEL ||
+ ANY_USE_SEMANTIC_MODEL ||
ANY_MODIFY_SEMANTIC_MODEL
""";
diff --git
a/server-common/src/main/java/org/apache/gravitino/server/authorization/expression/AuthorizationExpressionConverter.java
b/server-common/src/main/java/org/apache/gravitino/server/authorization/expression/AuthorizationExpressionConverter.java
index 7d0e28b5b6..ca6fdb448a 100644
---
a/server-common/src/main/java/org/apache/gravitino/server/authorization/expression/AuthorizationExpressionConverter.java
+++
b/server-common/src/main/java/org/apache/gravitino/server/authorization/expression/AuthorizationExpressionConverter.java
@@ -339,9 +339,9 @@ public class AuthorizationExpressionConverter {
+ "&& !(ANY(DENY_CREATE_SEMANTIC_MODEL, METALAKE, CATALOG,
SCHEMA)))");
expression =
expression.replaceAll(
- "ANY_SELECT_SEMANTIC_MODEL",
- "((ANY(SELECT_SEMANTIC_MODEL, METALAKE, CATALOG, SCHEMA,
SEMANTIC_MODEL)) "
- + "&& !(ANY(DENY_SELECT_SEMANTIC_MODEL, METALAKE, CATALOG,
SCHEMA, SEMANTIC_MODEL)))");
+ "ANY_USE_SEMANTIC_MODEL",
+ "((ANY(USE_SEMANTIC_MODEL, METALAKE, CATALOG, SCHEMA,
SEMANTIC_MODEL)) "
+ + "&& !(ANY(DENY_USE_SEMANTIC_MODEL, METALAKE, CATALOG,
SCHEMA, SEMANTIC_MODEL)))");
expression =
expression.replaceAll(
"ANY_MODIFY_SEMANTIC_MODEL",
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/authorization/TestSemanticModelAuthorizationExpression.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/authorization/TestSemanticModelAuthorizationExpression.java
index 5ab64844dc..9017aad549 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/authorization/TestSemanticModelAuthorizationExpression.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/authorization/TestSemanticModelAuthorizationExpression.java
@@ -28,8 +28,8 @@ import org.junit.jupiter.api.Test;
/**
* Verifies the Semantic Model authorization expressions against the rules in
the Semantic Model
* design: creation needs CREATE_SEMANTIC_MODEL under USE_CATALOG and
USE_SCHEMA, list and load
- * accept SELECT_SEMANTIC_MODEL or MODIFY_SEMANTIC_MODEL, alter needs
MODIFY_SEMANTIC_MODEL, and
- * drop needs ownership rather than any privilege.
+ * accept USE_SEMANTIC_MODEL or MODIFY_SEMANTIC_MODEL, alter needs
MODIFY_SEMANTIC_MODEL, and drop
+ * needs ownership rather than any privilege.
*/
public class TestSemanticModelAuthorizationExpression {
@@ -91,11 +91,11 @@ public class TestSemanticModelAuthorizationExpression {
ImmutableSet.of(
"SEMANTIC_MODEL::OWNER", "CATALOG::USE_CATALOG",
"SCHEMA::USE_SCHEMA")));
- // Either SELECT or MODIFY loads the definition.
+ // Either USE or MODIFY loads the definition.
assertTrue(
evaluator.getResult(
ImmutableSet.of(
- "SEMANTIC_MODEL::SELECT_SEMANTIC_MODEL",
+ "SEMANTIC_MODEL::USE_SEMANTIC_MODEL",
"CATALOG::USE_CATALOG",
"SCHEMA::USE_SCHEMA")));
assertTrue(
@@ -111,8 +111,8 @@ public class TestSemanticModelAuthorizationExpression {
assertFalse(
evaluator.getResult(
ImmutableSet.of(
- "METALAKE::SELECT_SEMANTIC_MODEL",
- "SEMANTIC_MODEL::DENY_SELECT_SEMANTIC_MODEL",
+ "METALAKE::USE_SEMANTIC_MODEL",
+ "SEMANTIC_MODEL::DENY_USE_SEMANTIC_MODEL",
"CATALOG::USE_CATALOG",
"SCHEMA::USE_SCHEMA")));
}
@@ -128,13 +128,12 @@ public class TestSemanticModelAuthorizationExpression {
assertTrue(evaluator.getResult(ImmutableSet.of("CATALOG::OWNER")));
assertTrue(evaluator.getResult(ImmutableSet.of("SCHEMA::OWNER")));
assertTrue(evaluator.getResult(ImmutableSet.of("SEMANTIC_MODEL::OWNER")));
-
assertTrue(evaluator.getResult(ImmutableSet.of("SCHEMA::SELECT_SEMANTIC_MODEL")));
+
assertTrue(evaluator.getResult(ImmutableSet.of("SCHEMA::USE_SEMANTIC_MODEL")));
assertTrue(evaluator.getResult(ImmutableSet.of("SEMANTIC_MODEL::MODIFY_SEMANTIC_MODEL")));
assertFalse(evaluator.getResult(ImmutableSet.of("SCHEMA::CREATE_SEMANTIC_MODEL")));
assertFalse(
evaluator.getResult(
- ImmutableSet.of(
- "METALAKE::SELECT_SEMANTIC_MODEL",
"SCHEMA::DENY_SELECT_SEMANTIC_MODEL")));
+ ImmutableSet.of("METALAKE::USE_SEMANTIC_MODEL",
"SCHEMA::DENY_USE_SEMANTIC_MODEL")));
}
@Test
@@ -157,11 +156,11 @@ public class TestSemanticModelAuthorizationExpression {
"CATALOG::USE_CATALOG",
"SCHEMA::USE_SCHEMA")));
- // SELECT_SEMANTIC_MODEL is read-only and must not permit an alter.
+ // USE_SEMANTIC_MODEL is read-only and must not permit an alter.
assertFalse(
evaluator.getResult(
ImmutableSet.of(
- "SEMANTIC_MODEL::SELECT_SEMANTIC_MODEL",
+ "SEMANTIC_MODEL::USE_SEMANTIC_MODEL",
"CATALOG::USE_CATALOG",
"SCHEMA::USE_SCHEMA")));
}