From d3412997f0aa1fef9029335ec04ce228bc7c70cb Mon Sep 17 00:00:00 2001 From: yuluo-yx Date: Fri, 21 Aug 2026 00:08:05 +0800 Subject: [PATCH] [ISSUE #2463] fix(auth): make status updates idempotent Signed-off-by: yuluo-yx --- .../apache/rocketmq/studio/auth/AuthService.java | 3 +++ .../studio/auth/AuthServiceDatabaseTest.java | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/server/src/main/java/org/apache/rocketmq/studio/auth/AuthService.java b/server/src/main/java/org/apache/rocketmq/studio/auth/AuthService.java index d5a67f4ba..832f24df2 100644 --- a/server/src/main/java/org/apache/rocketmq/studio/auth/AuthService.java +++ b/server/src/main/java/org/apache/rocketmq/studio/auth/AuthService.java @@ -187,6 +187,9 @@ public RmqStudioUser createUser(String username, String password, boolean admin) public RmqStudioUser setUserEnabled(Long userId, boolean enabled) { requireDatabaseBacked(); RmqStudioUser user = getUser(userId); + if (Boolean.valueOf(enabled).equals(user.getEnabled())) { + return user; + } if (!enabled && Boolean.TRUE.equals(user.getAdmin()) && enabledAdminCount() <= 1) { throw new BusinessException(409, "The last enabled administrator cannot be disabled"); } diff --git a/server/src/test/java/org/apache/rocketmq/studio/auth/AuthServiceDatabaseTest.java b/server/src/test/java/org/apache/rocketmq/studio/auth/AuthServiceDatabaseTest.java index 9ef733e6a..ed033b3ad 100644 --- a/server/src/test/java/org/apache/rocketmq/studio/auth/AuthServiceDatabaseTest.java +++ b/server/src/test/java/org/apache/rocketmq/studio/auth/AuthServiceDatabaseTest.java @@ -107,6 +107,19 @@ void disablingLastEnabledAdministratorIsRejected() { .hasMessage("The last enabled administrator cannot be disabled"); } + @Test + void disablingAnAlreadyDisabledAdministratorIsIdempotent() { + RmqStudioUser user = user(1L, "retired-admin", true, false, "password-1"); + when(userMapper.selectById(1L)).thenReturn(user); + + RmqStudioUser result = authService.setUserEnabled(1L, false); + + assertThat(result).isSameAs(user); + verify(userMapper, never()).selectCount(any(Wrapper.class)); + verify(userMapper, never()).updateById(any(RmqStudioUser.class)); + verify(sessionMapper, never()).update(isNull(), any(Wrapper.class)); + } + @Test void databaseAuthenticationThrottlesLastSeenWrites() { RmqStudioUser user = user(1L, "operator", false, true, "password-1");