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");
+         }
       };
    }