This is an automated email from the ASF dual-hosted git repository.

lizhimins pushed a commit to branch rocketmq-studio
in repository https://gitbox.apache.org/repos/asf/rocketmq-dashboard.git


The following commit(s) were added to refs/heads/rocketmq-studio by this push:
     new 90ee10c5 fix(auth): restrict LLM configuration tests to administrators 
(#1713)
90ee10c5 is described below

commit 90ee10c5c05fcc02a640b2f104dfa9ae1df14b53
Author: youngkermit8-coder <[email protected]>
AuthorDate: Tue Aug 11 21:26:45 2026 +0800

    fix(auth): restrict LLM configuration tests to administrators (#1713)
    
    * fix: restrict LLM configuration tests to admins
    
    Signed-off-by: youngkermit8-coder <[email protected]>
    
    * fix: restrict LLM model discovery to admins
    
    Signed-off-by: youngkermit8-coder <[email protected]>
    
    ---------
    
    Signed-off-by: youngkermit8-coder <[email protected]>
---
 .../rocketmq/studio/auth/AuthInterceptor.java      |  8 ++---
 .../rocketmq/studio/auth/AuthInterceptorTest.java  | 38 ++++++++++++++++++++++
 2 files changed, 42 insertions(+), 4 deletions(-)

diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/auth/AuthInterceptor.java 
b/server/src/main/java/org/apache/rocketmq/studio/auth/AuthInterceptor.java
index 685183ff..dbf9dd0a 100644
--- a/server/src/main/java/org/apache/rocketmq/studio/auth/AuthInterceptor.java
+++ b/server/src/main/java/org/apache/rocketmq/studio/auth/AuthInterceptor.java
@@ -37,7 +37,6 @@ public class AuthInterceptor implements HandlerInterceptor {
     private static final Set<String> READER_POST_PATHS = Set.of(
             "/api/auth/logout",
             "/api/ai/chat",
-            "/api/llm/config/test",
             "/api/metrics/query",
             "/api/metrics/query/datasource");
 
@@ -99,9 +98,10 @@ public class AuthInterceptor implements HandlerInterceptor {
     }
 
     private boolean isAdminOnlyGetPath(String path) {
-        String pathWithoutParameters = stripPathParameters(path);
-        return isCredentialRevealPath(pathWithoutParameters, "/api/acl/users/")
-                || isCredentialRevealPath(pathWithoutParameters, 
"/api/cloud-credentials/");
+        String normalizedPath = normalizePath(stripPathParameters(path));
+        return "/api/llm/models".equals(normalizedPath)
+                || isCredentialRevealPath(normalizedPath, "/api/acl/users/")
+                || isCredentialRevealPath(normalizedPath, 
"/api/cloud-credentials/");
     }
 
     private boolean isCredentialRevealPath(String path, String prefix) {
diff --git 
a/server/src/test/java/org/apache/rocketmq/studio/auth/AuthInterceptorTest.java 
b/server/src/test/java/org/apache/rocketmq/studio/auth/AuthInterceptorTest.java
index 8d6c7602..64727985 100644
--- 
a/server/src/test/java/org/apache/rocketmq/studio/auth/AuthInterceptorTest.java
+++ 
b/server/src/test/java/org/apache/rocketmq/studio/auth/AuthInterceptorTest.java
@@ -217,6 +217,31 @@ class AuthInterceptorTest {
         assertThat(allowed).isTrue();
     }
 
+    @Test
+    void shouldRejectLlmModelDiscoveryForNonAdminUser() throws Exception {
+        TestSession session = login(false);
+        MockHttpServletRequest request = authenticatedRequest(
+                "GET", "/api/llm/models", session.token());
+        MockHttpServletResponse response = new MockHttpServletResponse();
+
+        boolean allowed = session.interceptor().preHandle(request, response, 
new Object());
+
+        assertThat(allowed).isFalse();
+        assertThat(response.getStatus()).isEqualTo(403);
+    }
+
+    @Test
+    void shouldAllowLlmModelDiscoveryForAdminUser() throws Exception {
+        TestSession session = login(true);
+        MockHttpServletRequest request = authenticatedRequest(
+                "GET", "/api/llm/models", session.token());
+
+        boolean allowed = session.interceptor().preHandle(
+                request, new MockHttpServletResponse(), new Object());
+
+        assertThat(allowed).isTrue();
+    }
+
     @Test
     void shouldRejectMutatingPostForNonAdminUser() throws Exception {
         TestSession session = login(false);
@@ -306,6 +331,19 @@ class AuthInterceptorTest {
         assertThat(allowed).isTrue();
     }
 
+    @Test
+    void shouldRejectLlmConfigTestForNonAdminUser() throws Exception {
+        TestSession session = login(false);
+        MockHttpServletRequest request = authenticatedRequest(
+                "POST", "/api/llm/config/test", session.token());
+        MockHttpServletResponse response = new MockHttpServletResponse();
+
+        boolean allowed = session.interceptor().preHandle(request, response, 
new Object());
+
+        assertThat(allowed).isFalse();
+        assertThat(response.getStatus()).isEqualTo(403);
+    }
+
     @Test
     void shouldAllowLogoutForNonAdminUser() throws Exception {
         TestSession session = login(false);

Reply via email to