This is an automated email from the ASF dual-hosted git repository.
roryqi pushed a commit to branch branch-1.3
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/branch-1.3 by this push:
new 8c1e08cebb [Cherry-pick to branch-1.3] [#12885] fix(audit): Include
role names in role assignment logs (#12886) (#12898)
8c1e08cebb is described below
commit 8c1e08cebbbd0e26287db585d0ab42eb02bc4b1a
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Fri Sep 4 11:03:02 2026 +0800
[Cherry-pick to branch-1.3] [#12885] fix(audit): Include role names in role
assignment logs (#12886) (#12898)
**Cherry-pick Information:**
- Original commit: 8e25f016d026b3fffe0012e6ca3a5906746c0781
- Target branch: `branch-1.3`
- Status: ✅ Clean cherry-pick (no conflicts)
Co-authored-by: roryqi <[email protected]>
---
.../listener/api/event/GrantGroupRolesEvent.java | 7 ++++
.../api/event/GrantGroupRolesFailureEvent.java | 7 ++++
.../listener/api/event/GrantUserRolesEvent.java | 7 ++++
.../api/event/GrantUserRolesFailureEvent.java | 7 ++++
.../listener/api/event/RevokeGroupRolesEvent.java | 7 ++++
.../api/event/RevokeGroupRolesFailureEvent.java | 7 ++++
.../listener/api/event/RevokeUserRolesEvent.java | 7 ++++
.../api/event/RevokeUserRolesFailureEvent.java | 7 ++++
.../api/event/RoleAssignmentAuditInfos.java | 40 ++++++++++++++++++++++
.../gravitino/audit/v2/TestSimpleAuditLogV2.java | 16 +++++++++
.../listener/api/event/TestGroupEvent.java | 8 +++++
.../listener/api/event/TestUserEvent.java | 8 +++++
12 files changed, 128 insertions(+)
diff --git
a/core/src/main/java/org/apache/gravitino/listener/api/event/GrantGroupRolesEvent.java
b/core/src/main/java/org/apache/gravitino/listener/api/event/GrantGroupRolesEvent.java
index 04c754ed02..e3d181357d 100644
---
a/core/src/main/java/org/apache/gravitino/listener/api/event/GrantGroupRolesEvent.java
+++
b/core/src/main/java/org/apache/gravitino/listener/api/event/GrantGroupRolesEvent.java
@@ -21,6 +21,7 @@ package org.apache.gravitino.listener.api.event;
import com.google.common.collect.ImmutableList;
import java.util.List;
+import java.util.Map;
import org.apache.gravitino.annotation.DeveloperApi;
import org.apache.gravitino.listener.api.info.GroupInfo;
import org.apache.gravitino.utils.NameIdentifierUtil;
@@ -65,6 +66,12 @@ public class GrantGroupRolesEvent extends GroupEvent {
return roles;
}
+ /** {@inheritDoc} */
+ @Override
+ public Map<String, String> customInfo() {
+ return RoleAssignmentAuditInfos.of(roles);
+ }
+
/**
* Returns the operation type of this event.
*
diff --git
a/core/src/main/java/org/apache/gravitino/listener/api/event/GrantGroupRolesFailureEvent.java
b/core/src/main/java/org/apache/gravitino/listener/api/event/GrantGroupRolesFailureEvent.java
index 21e8f03567..23c0b4eb02 100644
---
a/core/src/main/java/org/apache/gravitino/listener/api/event/GrantGroupRolesFailureEvent.java
+++
b/core/src/main/java/org/apache/gravitino/listener/api/event/GrantGroupRolesFailureEvent.java
@@ -20,6 +20,7 @@
package org.apache.gravitino.listener.api.event;
import java.util.List;
+import java.util.Map;
import org.apache.gravitino.annotation.DeveloperApi;
import org.apache.gravitino.utils.NameIdentifierUtil;
@@ -71,6 +72,12 @@ public class GrantGroupRolesFailureEvent extends
GroupFailureEvent {
return roles;
}
+ /** {@inheritDoc} */
+ @Override
+ public Map<String, String> customInfo() {
+ return RoleAssignmentAuditInfos.of(roles);
+ }
+
/**
* Returns the operation type of this event.
*
diff --git
a/core/src/main/java/org/apache/gravitino/listener/api/event/GrantUserRolesEvent.java
b/core/src/main/java/org/apache/gravitino/listener/api/event/GrantUserRolesEvent.java
index 160c0e106b..705877b484 100644
---
a/core/src/main/java/org/apache/gravitino/listener/api/event/GrantUserRolesEvent.java
+++
b/core/src/main/java/org/apache/gravitino/listener/api/event/GrantUserRolesEvent.java
@@ -21,6 +21,7 @@ package org.apache.gravitino.listener.api.event;
import com.google.common.collect.ImmutableList;
import java.util.List;
+import java.util.Map;
import org.apache.gravitino.annotation.DeveloperApi;
import org.apache.gravitino.listener.api.info.UserInfo;
import org.apache.gravitino.utils.NameIdentifierUtil;
@@ -66,6 +67,12 @@ public class GrantUserRolesEvent extends UserEvent {
return roles;
}
+ /** {@inheritDoc} */
+ @Override
+ public Map<String, String> customInfo() {
+ return RoleAssignmentAuditInfos.of(roles);
+ }
+
/**
* Returns the operation type of this event.
*
diff --git
a/core/src/main/java/org/apache/gravitino/listener/api/event/GrantUserRolesFailureEvent.java
b/core/src/main/java/org/apache/gravitino/listener/api/event/GrantUserRolesFailureEvent.java
index 5db68065bc..2cf48293e1 100644
---
a/core/src/main/java/org/apache/gravitino/listener/api/event/GrantUserRolesFailureEvent.java
+++
b/core/src/main/java/org/apache/gravitino/listener/api/event/GrantUserRolesFailureEvent.java
@@ -20,6 +20,7 @@
package org.apache.gravitino.listener.api.event;
import java.util.List;
+import java.util.Map;
import org.apache.gravitino.annotation.DeveloperApi;
import org.apache.gravitino.utils.NameIdentifierUtil;
@@ -65,6 +66,12 @@ public class GrantUserRolesFailureEvent extends
UserFailureEvent {
return roles;
}
+ /** {@inheritDoc} */
+ @Override
+ public Map<String, String> customInfo() {
+ return RoleAssignmentAuditInfos.of(roles);
+ }
+
/**
* Returns the operation type of this event.
*
diff --git
a/core/src/main/java/org/apache/gravitino/listener/api/event/RevokeGroupRolesEvent.java
b/core/src/main/java/org/apache/gravitino/listener/api/event/RevokeGroupRolesEvent.java
index 48f928a821..6a7af8106c 100644
---
a/core/src/main/java/org/apache/gravitino/listener/api/event/RevokeGroupRolesEvent.java
+++
b/core/src/main/java/org/apache/gravitino/listener/api/event/RevokeGroupRolesEvent.java
@@ -21,6 +21,7 @@ package org.apache.gravitino.listener.api.event;
import com.google.common.collect.ImmutableList;
import java.util.List;
+import java.util.Map;
import org.apache.gravitino.annotation.DeveloperApi;
import org.apache.gravitino.listener.api.info.GroupInfo;
import org.apache.gravitino.utils.NameIdentifierUtil;
@@ -66,6 +67,12 @@ public class RevokeGroupRolesEvent extends GroupEvent {
return roles;
}
+ /** {@inheritDoc} */
+ @Override
+ public Map<String, String> customInfo() {
+ return RoleAssignmentAuditInfos.of(roles);
+ }
+
/**
* Returns the operation type of this event.
*
diff --git
a/core/src/main/java/org/apache/gravitino/listener/api/event/RevokeGroupRolesFailureEvent.java
b/core/src/main/java/org/apache/gravitino/listener/api/event/RevokeGroupRolesFailureEvent.java
index 08f7f99662..8d1d993fce 100644
---
a/core/src/main/java/org/apache/gravitino/listener/api/event/RevokeGroupRolesFailureEvent.java
+++
b/core/src/main/java/org/apache/gravitino/listener/api/event/RevokeGroupRolesFailureEvent.java
@@ -20,6 +20,7 @@
package org.apache.gravitino.listener.api.event;
import java.util.List;
+import java.util.Map;
import org.apache.gravitino.annotation.DeveloperApi;
import org.apache.gravitino.utils.NameIdentifierUtil;
@@ -71,6 +72,12 @@ public class RevokeGroupRolesFailureEvent extends
GroupFailureEvent {
return roles;
}
+ /** {@inheritDoc} */
+ @Override
+ public Map<String, String> customInfo() {
+ return RoleAssignmentAuditInfos.of(roles);
+ }
+
/**
* Returns the operation type of this event.
*
diff --git
a/core/src/main/java/org/apache/gravitino/listener/api/event/RevokeUserRolesEvent.java
b/core/src/main/java/org/apache/gravitino/listener/api/event/RevokeUserRolesEvent.java
index 94d0450f05..76091ab704 100644
---
a/core/src/main/java/org/apache/gravitino/listener/api/event/RevokeUserRolesEvent.java
+++
b/core/src/main/java/org/apache/gravitino/listener/api/event/RevokeUserRolesEvent.java
@@ -21,6 +21,7 @@ package org.apache.gravitino.listener.api.event;
import com.google.common.collect.ImmutableList;
import java.util.List;
+import java.util.Map;
import org.apache.gravitino.annotation.DeveloperApi;
import org.apache.gravitino.listener.api.info.UserInfo;
import org.apache.gravitino.utils.NameIdentifierUtil;
@@ -66,6 +67,12 @@ public class RevokeUserRolesEvent extends UserEvent {
return roles;
}
+ /** {@inheritDoc} */
+ @Override
+ public Map<String, String> customInfo() {
+ return RoleAssignmentAuditInfos.of(roles);
+ }
+
/**
* Returns the operation type of this event.
*
diff --git
a/core/src/main/java/org/apache/gravitino/listener/api/event/RevokeUserRolesFailureEvent.java
b/core/src/main/java/org/apache/gravitino/listener/api/event/RevokeUserRolesFailureEvent.java
index d64d02e794..4f25e51395 100644
---
a/core/src/main/java/org/apache/gravitino/listener/api/event/RevokeUserRolesFailureEvent.java
+++
b/core/src/main/java/org/apache/gravitino/listener/api/event/RevokeUserRolesFailureEvent.java
@@ -20,6 +20,7 @@
package org.apache.gravitino.listener.api.event;
import java.util.List;
+import java.util.Map;
import org.apache.gravitino.annotation.DeveloperApi;
import org.apache.gravitino.utils.NameIdentifierUtil;
@@ -66,6 +67,12 @@ public class RevokeUserRolesFailureEvent extends
UserFailureEvent {
return roles;
}
+ /** {@inheritDoc} */
+ @Override
+ public Map<String, String> customInfo() {
+ return RoleAssignmentAuditInfos.of(roles);
+ }
+
/**
* Returns the operation type of this event.
*
diff --git
a/core/src/main/java/org/apache/gravitino/listener/api/event/RoleAssignmentAuditInfos.java
b/core/src/main/java/org/apache/gravitino/listener/api/event/RoleAssignmentAuditInfos.java
new file mode 100644
index 0000000000..e559109d7a
--- /dev/null
+++
b/core/src/main/java/org/apache/gravitino/listener/api/event/RoleAssignmentAuditInfos.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.listener.api.event;
+
+import com.google.common.collect.ImmutableMap;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.Nullable;
+
+/** Shared customInfo keys and values for role assignment audit events. */
+final class RoleAssignmentAuditInfos {
+
+ static final String ROLE_NAMES = "roleNames";
+
+ private RoleAssignmentAuditInfos() {}
+
+ static Map<String, String> of(@Nullable List<String> roles) {
+ if (roles == null || roles.isEmpty()) {
+ return ImmutableMap.of();
+ }
+ return ImmutableMap.of(ROLE_NAMES, String.join(",", roles));
+ }
+}
diff --git
a/core/src/test/java/org/apache/gravitino/audit/v2/TestSimpleAuditLogV2.java
b/core/src/test/java/org/apache/gravitino/audit/v2/TestSimpleAuditLogV2.java
index 233d28b009..8c68859ef1 100644
--- a/core/src/test/java/org/apache/gravitino/audit/v2/TestSimpleAuditLogV2.java
+++ b/core/src/test/java/org/apache/gravitino/audit/v2/TestSimpleAuditLogV2.java
@@ -19,12 +19,14 @@
package org.apache.gravitino.audit.v2;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import java.util.Map;
import org.apache.gravitino.NameIdentifier;
import org.apache.gravitino.Namespace;
import org.apache.gravitino.listener.api.event.Event;
import org.apache.gravitino.listener.api.event.EventSource;
+import org.apache.gravitino.listener.api.event.GrantUserRolesFailureEvent;
import org.apache.gravitino.listener.api.event.ListCatalogEvent;
import org.apache.gravitino.listener.api.event.ListMetalakeEvent;
import org.apache.gravitino.listener.api.event.ListSchemaEvent;
@@ -68,6 +70,20 @@ public class TestSimpleAuditLogV2 {
Assertions.assertEquals("", fields[7], "Last field should be empty when
customInfo is absent");
}
+ @Test
+ public void testRoleAssignmentIncludesRoleNames() {
+ GrantUserRolesFailureEvent event =
+ new GrantUserRolesFailureEvent(
+ "admin",
+ "metalake",
+ new RuntimeException("failed"),
+ "alice",
+ ImmutableList.of("reader", "admin"));
+
+ String customInfo = new SimpleAuditLogV2(event).toString().split("\\t",
-1)[7];
+ Assertions.assertEquals("{roleNames=reader,admin}", customInfo);
+ }
+
@Test
public void testOutputContainsAllCoreFields() {
SimpleAuditLogV2 log = new SimpleAuditLogV2(new StubEvent());
diff --git
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestGroupEvent.java
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestGroupEvent.java
index b69a0dcae9..2e4878462d 100644
---
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestGroupEvent.java
+++
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestGroupEvent.java
@@ -452,6 +452,8 @@ public class TestGroupEvent {
GrantGroupRolesEvent grantGroupRolesEvent = (GrantGroupRolesEvent) event;
Assertions.assertEquals(
NameIdentifierUtil.ofGroup(METALAKE, groupName),
grantGroupRolesEvent.identifier());
+ Assertions.assertEquals(
+ String.join(",", grantedRoles),
grantGroupRolesEvent.customInfo().get("roleNames"));
GroupInfo groupInfo = grantGroupRolesEvent.grantedGroupInfo();
validateGroup(groupInfo, group);
@@ -474,6 +476,8 @@ public class TestGroupEvent {
NameIdentifierUtil.ofGroup(METALAKE, groupName),
grantGroupRolesFailureEvent.identifier());
Assertions.assertEquals(groupName,
grantGroupRolesFailureEvent.groupName());
Assertions.assertEquals(grantedRoles, grantGroupRolesFailureEvent.roles());
+ Assertions.assertEquals(
+ String.join(",", grantedRoles),
grantGroupRolesFailureEvent.customInfo().get("roleNames"));
}
@Test
@@ -508,6 +512,8 @@ public class TestGroupEvent {
RevokeGroupRolesEvent revokeGroupRolesEvent = (RevokeGroupRolesEvent)
event;
Assertions.assertEquals(
NameIdentifierUtil.ofGroup(METALAKE, otherGroupName),
revokeGroupRolesEvent.identifier());
+ Assertions.assertEquals(
+ String.join(",", revokedRoles),
revokeGroupRolesEvent.customInfo().get("roleNames"));
GroupInfo groupInfo = revokeGroupRolesEvent.revokedGroupInfo();
validateGroup(groupInfo, otherGroup);
@@ -532,6 +538,8 @@ public class TestGroupEvent {
revokeGroupRolesFailureEvent.identifier());
Assertions.assertEquals(otherGroupName,
revokeGroupRolesFailureEvent.groupName());
Assertions.assertEquals(revokedRoles,
revokeGroupRolesFailureEvent.roles());
+ Assertions.assertEquals(
+ String.join(",", revokedRoles),
revokeGroupRolesFailureEvent.customInfo().get("roleNames"));
}
private Group getMockGroup(String name, List<String> roles) {
diff --git
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestUserEvent.java
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestUserEvent.java
index c6574a140e..c6bdb9d6e0 100644
---
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestUserEvent.java
+++
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestUserEvent.java
@@ -393,6 +393,8 @@ public class TestUserEvent {
GrantUserRolesEvent grantUserRolesEvent = (GrantUserRolesEvent) event;
Assertions.assertEquals(identifier, grantUserRolesEvent.identifier());
+ Assertions.assertEquals(
+ String.join(",", grantedRoles),
grantUserRolesEvent.customInfo().get("roleNames"));
UserInfo userInfo = grantUserRolesEvent.grantUserInfo();
validateUserInfo(userInfo, user);
@@ -416,6 +418,8 @@ public class TestUserEvent {
grantUserRolesFailureEvent.identifier());
Assertions.assertEquals(inExistUserName,
grantUserRolesFailureEvent.userName());
Assertions.assertEquals(grantedRoles, grantUserRolesFailureEvent.roles());
+ Assertions.assertEquals(
+ String.join(",", grantedRoles),
grantUserRolesFailureEvent.customInfo().get("roleNames"));
}
@Test
@@ -447,6 +451,8 @@ public class TestUserEvent {
RevokeUserRolesEvent revokeUserRolesEvent = (RevokeUserRolesEvent) event;
Assertions.assertEquals(otherIdentifier,
revokeUserRolesEvent.identifier());
+ Assertions.assertEquals(
+ String.join(",", revokedRoles),
revokeUserRolesEvent.customInfo().get("roleNames"));
UserInfo userInfo = revokeUserRolesEvent.revokedUserInfo();
validateUserInfo(userInfo, otherUser);
@@ -470,6 +476,8 @@ public class TestUserEvent {
revokeUserRolesFailureEvent.identifier());
Assertions.assertEquals(inExistUserName,
revokeUserRolesFailureEvent.userName());
Assertions.assertEquals(revokedRoles, revokeUserRolesFailureEvent.roles());
+ Assertions.assertEquals(
+ String.join(",", revokedRoles),
revokeUserRolesFailureEvent.customInfo().get("roleNames"));
}
private AccessControlEventDispatcher mockUserDispatcher() {