You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by br...@apache.org on 2023/05/26 14:47:41 UTC
[activemq-artemis] branch main updated: ARTEMIS-4293 add mngmnt ops to clear authn/z caches
This is an automated email from the ASF dual-hosted git repository.
brusdev pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
The following commit(s) were added to refs/heads/main by this push:
new 15aafe0b70 ARTEMIS-4293 add mngmnt ops to clear authn/z caches
15aafe0b70 is described below
commit 15aafe0b70f59c0edc255bb648cc4007e9a29811
Author: Justin Bertram <jb...@apache.org>
AuthorDate: Thu May 25 18:07:33 2023 -0500
ARTEMIS-4293 add mngmnt ops to clear authn/z caches
---
.../apache/activemq/artemis/logs/AuditLogger.java | 14 ++++++++++++
.../api/core/management/ActiveMQServerControl.java | 6 +++++
.../management/impl/ActiveMQServerControlImpl.java | 16 +++++++++++++
.../core/security/impl/SecurityStoreImpl.java | 2 --
.../management/ActiveMQServerControlTest.java | 26 ++++++++++++++++++++++
.../ActiveMQServerControlUsingCoreTest.java | 10 +++++++++
6 files changed, 72 insertions(+), 2 deletions(-)
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
index 2f02c7d4f7..9af9075ea9 100644
--- a/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
@@ -2653,4 +2653,18 @@ public interface AuditLogger {
@LogMessage(id = 601768, value = "{} connection {} for user {} destroyed", level = LogMessage.Level.INFO)
void destroyedConnection(String protocol, String connectionID, String user);
+
+ static void clearAuthenticationCache(Object source) {
+ BASE_LOGGER.clearAuthenticationCache(getCaller(), source);
+ }
+
+ @LogMessage(id = 601769, value = "User {} is clearing authentication cache on target resource: {}", level = LogMessage.Level.INFO)
+ void clearAuthenticationCache(String user, Object source);
+
+ static void clearAuthorizationCache(Object source) {
+ BASE_LOGGER.clearAuthorizationCache(getCaller(), source);
+ }
+
+ @LogMessage(id = 601770, value = "User {} is clearing authorization cache on target resource: {}", level = LogMessage.Level.INFO)
+ void clearAuthorizationCache(String user, Object source);
}
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
index 2229abfee5..0c4289fb52 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
@@ -2006,5 +2006,11 @@ public interface ActiveMQServerControl {
@Attribute(desc = "Scan all paged destinations to rebuild the page counters")
void rebuildPageCounters() throws Exception;
+
+ @Operation(desc = "Clear the authentication cache", impact = MBeanOperationInfo.ACTION)
+ void clearAuthenticationCache() throws Exception;
+
+ @Operation(desc = "Clear the authorization cache", impact = MBeanOperationInfo.ACTION)
+ void clearAuthorizationCache() throws Exception;
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
index eb147349b4..1096ebee4f 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
@@ -4664,5 +4664,21 @@ public class ActiveMQServerControlImpl extends AbstractControl implements Active
}
throw ActiveMQMessageBundle.BUNDLE.embeddedWebServerNotFound();
}
+
+ @Override
+ public void clearAuthenticationCache() {
+ if (AuditLogger.isBaseLoggingEnabled()) {
+ AuditLogger.clearAuthenticationCache(this.server);
+ }
+ ((SecurityStoreImpl)server.getSecurityStore()).invalidateAuthenticationCache();
+ }
+
+ @Override
+ public void clearAuthorizationCache() {
+ if (AuditLogger.isBaseLoggingEnabled()) {
+ AuditLogger.clearAuthorizationCache(this.server);
+ }
+ ((SecurityStoreImpl)server.getSecurityStore()).invalidateAuthorizationCache();
+ }
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/security/impl/SecurityStoreImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/security/impl/SecurityStoreImpl.java
index 7f770d9711..14c393d032 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/security/impl/SecurityStoreImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/security/impl/SecurityStoreImpl.java
@@ -424,12 +424,10 @@ public class SecurityStoreImpl implements SecurityStore, HierarchicalRepositoryC
logger.debug("Skipping authentication cache due to exception: {}", e.getMessage());
}
- // public for testing purposes
public void invalidateAuthorizationCache() {
authorizationCache.invalidateAll();
}
- // public for testing purposes
public void invalidateAuthenticationCache() {
authenticationCache.invalidateAll();
}
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
index d758fb62f8..b6585dbcc4 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
@@ -257,6 +257,32 @@ public class ActiveMQServerControlTest extends ManagementTestBase {
Wait.assertEquals(usingCore() ? 8 : 1, () -> serverControl.getAuthorizationCacheSize());
}
+ @Test
+ public void testClearingSecurityCaches() throws Exception {
+ ActiveMQServerControl serverControl = createManagementControl();
+
+ ServerLocator loc = createInVMNonHALocator();
+ ClientSessionFactory csf = createSessionFactory(loc);
+ ClientSession session = csf.createSession("myUser", "myPass", false, true, false, false, 0);
+ session.start();
+
+ final String address = "ADDRESS";
+ serverControl.createAddress(address, "MULTICAST");
+ ClientProducer producer = session.createProducer(address);
+ ClientMessage m = session.createMessage(true);
+ m.putStringProperty("hello", "world");
+ producer.send(m);
+
+ Assert.assertTrue(serverControl.getAuthenticationCacheSize() > 0);
+ Wait.assertTrue(() -> serverControl.getAuthorizationCacheSize() > 0);
+
+ serverControl.clearAuthenticationCache();
+ serverControl.clearAuthorizationCache();
+
+ Assert.assertEquals(usingCore() ? 1 : 0, serverControl.getAuthenticationCacheSize());
+ Assert.assertEquals(usingCore() ? 7 : 0, serverControl.getAuthorizationCacheSize());
+ }
+
@Test
public void testGetConnectors() throws Exception {
ActiveMQServerControl serverControl = createManagementControl();
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
index 5cb2cc98d6..fd1fee8be2 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
@@ -1754,6 +1754,16 @@ public class ActiveMQServerControlUsingCoreTest extends ActiveMQServerControlTes
public void rebuildPageCounters() throws Exception {
proxy.invokeOperation("rebuildPageCounters");
}
+
+ @Override
+ public void clearAuthenticationCache() throws Exception {
+ proxy.invokeOperation("clearAuthenticationCache");
+ }
+
+ @Override
+ public void clearAuthorizationCache() throws Exception {
+ proxy.invokeOperation("clearAuthorizationCache");
+ }
};
}