Skip to content

Commit 4d8f9fa

Browse files
authored
[#5750] improvement(auth): Add metalake name in the authorization plugin (#5751)
### What changes were proposed in this pull request? Add metalake name variable in the `BaseAuthorization::newPlugin()` params. ### Why are the changes needed? Fix: #5750 ### Does this PR introduce _any_ user-facing change? N/A ### How was this patch tested? Add ITs.
1 parent 5a2249b commit 4d8f9fa

File tree

10 files changed

+52
-27
lines changed

10 files changed

+52
-27
lines changed

authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorization.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,13 @@ public String shortName() {
3030
}
3131

3232
@Override
33-
protected AuthorizationPlugin newPlugin(String catalogProvider, Map<String, String> config) {
33+
protected AuthorizationPlugin newPlugin(
34+
String metalake, String catalogProvider, Map<String, String> config) {
3435
switch (catalogProvider) {
3536
case "hive":
3637
case "lakehouse-iceberg":
3738
case "lakehouse-paimon":
38-
return RangerAuthorizationHadoopSQLPlugin.getInstance(config);
39+
return RangerAuthorizationHadoopSQLPlugin.getInstance(metalake, config);
3940
default:
4041
throw new IllegalArgumentException("Unknown catalog provider: " + catalogProvider);
4142
}

authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHadoopSQLPlugin.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,16 @@ public class RangerAuthorizationHadoopSQLPlugin extends RangerAuthorizationPlugi
4949
LoggerFactory.getLogger(RangerAuthorizationHadoopSQLPlugin.class);
5050
private static volatile RangerAuthorizationHadoopSQLPlugin instance = null;
5151

52-
private RangerAuthorizationHadoopSQLPlugin(Map<String, String> config) {
53-
super(config);
52+
private RangerAuthorizationHadoopSQLPlugin(String metalake, Map<String, String> config) {
53+
super(metalake, config);
5454
}
5555

5656
public static synchronized RangerAuthorizationHadoopSQLPlugin getInstance(
57-
Map<String, String> config) {
57+
String metalake, Map<String, String> config) {
5858
if (instance == null) {
5959
synchronized (RangerAuthorizationHadoopSQLPlugin.class) {
6060
if (instance == null) {
61-
instance = new RangerAuthorizationHadoopSQLPlugin(config);
61+
instance = new RangerAuthorizationHadoopSQLPlugin(metalake, config);
6262
}
6363
}
6464
}

authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationPlugin.java

+19-8
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,14 @@ public abstract class RangerAuthorizationPlugin
8080
implements AuthorizationPlugin, AuthorizationPrivilegesMappingProvider {
8181
private static final Logger LOG = LoggerFactory.getLogger(RangerAuthorizationPlugin.class);
8282

83+
protected String metalake;
8384
protected final String rangerServiceName;
8485
protected final RangerClientExtension rangerClient;
8586
private final RangerHelper rangerHelper;
8687
@VisibleForTesting public final String rangerAdminName;
8788

88-
protected RangerAuthorizationPlugin(Map<String, String> config) {
89+
protected RangerAuthorizationPlugin(String metalake, Map<String, String> config) {
90+
this.metalake = metalake;
8991
String rangerUrl = config.get(AuthorizationPropertiesMeta.RANGER_ADMIN_URL);
9092
String authType = config.get(AuthorizationPropertiesMeta.RANGER_AUTH_TYPE);
9193
rangerAdminName = config.get(AuthorizationPropertiesMeta.RANGER_USERNAME);
@@ -108,6 +110,11 @@ protected RangerAuthorizationPlugin(Map<String, String> config) {
108110
policyResourceDefinesRule());
109111
}
110112

113+
@VisibleForTesting
114+
public String getMetalake() {
115+
return metalake;
116+
}
117+
111118
/**
112119
* Set the Ranger policy resource defines rule.
113120
*
@@ -251,18 +258,22 @@ public Boolean onMetadataUpdated(MetadataObjectChange... changes) throws Runtime
251258
((MetadataObjectChange.RenameMetadataObject) change).metadataObject();
252259
MetadataObject newMetadataObject =
253260
((MetadataObjectChange.RenameMetadataObject) change).newMetadataObject();
254-
AuthorizationMetadataObject AuthorizationMetadataObject =
255-
translateMetadataObject(metadataObject);
256-
AuthorizationMetadataObject newAuthorizationMetadataObject =
261+
if (metadataObject.type() == MetadataObject.Type.METALAKE
262+
&& newMetadataObject.type() == MetadataObject.Type.METALAKE) {
263+
// Modify the metalake name
264+
this.metalake = newMetadataObject.name();
265+
}
266+
AuthorizationMetadataObject oldAuthMetadataObject = translateMetadataObject(metadataObject);
267+
AuthorizationMetadataObject newAuthMetadataObject =
257268
translateMetadataObject(newMetadataObject);
258-
if (AuthorizationMetadataObject.equals(newAuthorizationMetadataObject)) {
269+
if (oldAuthMetadataObject.equals(newAuthMetadataObject)) {
259270
LOG.info(
260271
"The metadata object({}) and new metadata object({}) are equal, so ignore rename!",
261-
AuthorizationMetadataObject.fullName(),
262-
newAuthorizationMetadataObject.fullName());
272+
oldAuthMetadataObject.fullName(),
273+
newAuthMetadataObject.fullName());
263274
continue;
264275
}
265-
doRenameMetadataObject(AuthorizationMetadataObject, newAuthorizationMetadataObject);
276+
doRenameMetadataObject(oldAuthMetadataObject, newAuthMetadataObject);
266277
} else if (change instanceof MetadataObjectChange.RemoveMetadataObject) {
267278
MetadataObject metadataObject =
268279
((MetadataObjectChange.RemoveMetadataObject) change).metadataObject();

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -697,9 +697,8 @@ public void testMetadataObjectChangeRenameMetalake() {
697697
Assertions.assertTrue(rangerAuthHivePlugin.onRoleCreated(role));
698698
assertFindManagedPolicyItems(role, true);
699699

700-
MetadataObject newMetadataObject =
701-
MetadataObjects.parse(
702-
String.format("metalake-new-%s", currentFunName), oldMetadataObject.type());
700+
String newMetalake = String.format("metalake-new-%s", currentFunName);
701+
MetadataObject newMetadataObject = MetadataObjects.parse(newMetalake, oldMetadataObject.type());
703702
Assertions.assertTrue(
704703
rangerAuthHivePlugin.onMetadataUpdated(
705704
MetadataObjectChange.rename(oldMetadataObject, newMetadataObject)));
@@ -716,6 +715,7 @@ public void testMetadataObjectChangeRenameMetalake() {
716715
.withSecurableObjects(Lists.newArrayList(newSecurableObject1))
717716
.build();
718717
assertFindManagedPolicyItems(newRole, true);
718+
Assertions.assertEquals(newMetalake, rangerAuthHivePlugin.getMetalake());
719719
}
720720

721721
@Test

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

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ public static void init() {
8989

9090
rangerAuthHivePlugin =
9191
RangerAuthorizationHadoopSQLPlugin.getInstance(
92+
"metalake",
9293
ImmutableMap.of(
9394
AuthorizationPropertiesMeta.RANGER_ADMIN_URL,
9495
String.format(

core/src/main/java/org/apache/gravitino/connector/BaseCatalog.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ public AuthorizationPlugin getAuthorizationPlugin() {
184184
if (authorization == null) {
185185
return null;
186186
}
187-
return authorization.plugin(provider(), this.conf);
187+
return authorization.plugin(entity.namespace().level(0), provider(), this.conf);
188188
}
189189

190190
public void initAuthorizationPluginInstance(IsolatedClassLoader classLoader) {

core/src/main/java/org/apache/gravitino/connector/authorization/BaseAuthorization.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,14 @@ public abstract class BaseAuthorization<T extends BaseAuthorization>
4343
* @return A new instance of AuthorizationHook.
4444
*/
4545
protected abstract AuthorizationPlugin newPlugin(
46-
String catalogProvider, Map<String, String> config);
46+
String metalake, String catalogProvider, Map<String, String> config);
4747

48-
public AuthorizationPlugin plugin(String catalogProvider, Map<String, String> config) {
48+
public AuthorizationPlugin plugin(
49+
String metalake, String catalogProvider, Map<String, String> config) {
4950
if (plugin == null) {
5051
synchronized (this) {
5152
if (plugin == null) {
52-
plugin = newPlugin(catalogProvider, config);
53+
plugin = newPlugin(metalake, catalogProvider, config);
5354
}
5455
}
5556
}

core/src/main/java/org/apache/gravitino/hook/MetalakeHookDispatcher.java

+13-4
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.gravitino.MetalakeChange;
2626
import org.apache.gravitino.NameIdentifier;
2727
import org.apache.gravitino.authorization.AccessControlDispatcher;
28+
import org.apache.gravitino.authorization.AuthorizationUtils;
2829
import org.apache.gravitino.authorization.Owner;
2930
import org.apache.gravitino.authorization.OwnerManager;
3031
import org.apache.gravitino.exceptions.MetalakeAlreadyExistsException;
@@ -85,10 +86,18 @@ public Metalake createMetalake(
8586
@Override
8687
public Metalake alterMetalake(NameIdentifier ident, MetalakeChange... changes)
8788
throws NoSuchMetalakeException, IllegalArgumentException {
88-
// For underlying authorization plugins, the privilege information shouldn't
89-
// contain metalake information, so metalake rename won't affect the privileges
90-
// of the authorization plugin.
91-
return dispatcher.alterMetalake(ident, changes);
89+
Metalake alterMetalake = dispatcher.alterMetalake(ident, changes);
90+
MetalakeChange.RenameMetalake lastRenameChange = null;
91+
for (MetalakeChange change : changes) {
92+
if (change instanceof MetalakeChange.RenameMetalake) {
93+
lastRenameChange = (MetalakeChange.RenameMetalake) change;
94+
}
95+
}
96+
if (lastRenameChange != null) {
97+
AuthorizationUtils.authorizationPluginRenamePrivileges(
98+
ident, Entity.EntityType.METALAKE, lastRenameChange.getNewName());
99+
}
100+
return alterMetalake;
92101
}
93102

94103
@Override

core/src/test/java/org/apache/gravitino/connector/authorization/mysql/TestMySQLAuthorization.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ public String shortName() {
3232
}
3333

3434
@Override
35-
protected AuthorizationPlugin newPlugin(String catalogProvider, Map<String, String> config) {
35+
protected AuthorizationPlugin newPlugin(
36+
String metalake, String catalogProvider, Map<String, String> config) {
3637
return new TestMySQLAuthorizationPlugin();
3738
}
3839
}

core/src/test/java/org/apache/gravitino/connector/authorization/ranger/TestRangerAuthorization.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ public String shortName() {
3232
}
3333

3434
@Override
35-
protected AuthorizationPlugin newPlugin(String catalogProvider, Map<String, String> config) {
35+
protected AuthorizationPlugin newPlugin(
36+
String metalake, String catalogProvider, Map<String, String> config) {
3637
return new TestRangerAuthorizationPlugin();
3738
}
3839
}

0 commit comments

Comments
 (0)