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

SbloodyS pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new ed90f48b0c [Improvement-18558][API] Harden user list access and 
responses (#18560)
ed90f48b0c is described below

commit ed90f48b0cca64e203d6f98e71b895a2a82dc3a9
Author: Wenjun Ruan <[email protected]>
AuthorDate: Tue Aug 18 10:01:27 2026 +0800

    [Improvement-18558][API] Harden user list access and responses (#18560)
---
 .../api/controller/UsersController.java            |  3 +-
 .../dolphinscheduler/api/service/UsersService.java |  3 +-
 .../api/service/impl/UsersServiceImpl.java         | 12 ++++----
 .../dolphinscheduler/api/vo/UserSimpleInfoVO.java  | 35 ++++++++++++++++++++++
 .../api/controller/UsersControllerTest.java        |  5 ++++
 .../api/service/UsersServiceTest.java              | 18 +++++++----
 .../apache/dolphinscheduler/dao/entity/User.java   |  2 ++
 .../dolphinscheduler/dao/mapper/UserMapper.xml     |  3 +-
 .../src/service/modules/users/types.ts             | 12 --------
 9 files changed, 65 insertions(+), 28 deletions(-)

diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/UsersController.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/UsersController.java
index e41e0fe5c2..e7a96fef16 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/UsersController.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/UsersController.java
@@ -35,6 +35,7 @@ import org.apache.dolphinscheduler.api.enums.Status;
 import org.apache.dolphinscheduler.api.exceptions.ApiException;
 import org.apache.dolphinscheduler.api.service.UsersService;
 import org.apache.dolphinscheduler.api.utils.Result;
+import org.apache.dolphinscheduler.api.vo.UserSimpleInfoVO;
 import org.apache.dolphinscheduler.common.constants.Constants;
 import org.apache.dolphinscheduler.dao.entity.User;
 import org.apache.dolphinscheduler.plugin.task.api.utils.ParameterUtils;
@@ -296,7 +297,7 @@ public class UsersController extends BaseController {
     @GetMapping(value = "/list-all")
     @ResponseStatus(HttpStatus.OK)
     @ApiException(USER_LIST_ERROR)
-    public Result<List<User>> listAll(@RequestAttribute(value = 
Constants.SESSION_USER) User loginUser) {
+    public Result<List<UserSimpleInfoVO>> listAll(@RequestAttribute(value = 
Constants.SESSION_USER) User loginUser) {
         return Result.success(usersService.queryUserList(loginUser));
     }
 
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java
index d6fb0dc67f..6619e91ddd 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java
@@ -18,6 +18,7 @@
 package org.apache.dolphinscheduler.api.service;
 
 import org.apache.dolphinscheduler.api.utils.Result;
+import org.apache.dolphinscheduler.api.vo.UserSimpleInfoVO;
 import org.apache.dolphinscheduler.common.enums.UserType;
 import org.apache.dolphinscheduler.dao.entity.User;
 
@@ -147,7 +148,7 @@ public interface UsersService {
     /**
      * query enabled user list
      */
-    List<User> queryUserList(User loginUser);
+    List<UserSimpleInfoVO> queryUserList(User loginUser);
 
     /**
      * verify user name exists
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java
index db601d18db..54c08e091d 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java
@@ -17,8 +17,6 @@
 
 package org.apache.dolphinscheduler.api.service.impl;
 
-import static 
org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.USER_MANAGER;
-
 import org.apache.dolphinscheduler.api.enums.Status;
 import org.apache.dolphinscheduler.api.exceptions.ServiceException;
 import org.apache.dolphinscheduler.api.service.SessionService;
@@ -26,9 +24,9 @@ import org.apache.dolphinscheduler.api.service.UsersService;
 import org.apache.dolphinscheduler.api.utils.CheckUtils;
 import org.apache.dolphinscheduler.api.utils.PageInfo;
 import org.apache.dolphinscheduler.api.utils.Result;
+import org.apache.dolphinscheduler.api.vo.UserSimpleInfoVO;
 import org.apache.dolphinscheduler.common.constants.Constants;
 import org.apache.dolphinscheduler.common.constants.SystemConstants;
-import org.apache.dolphinscheduler.common.enums.AuthorizationType;
 import org.apache.dolphinscheduler.common.enums.Flag;
 import org.apache.dolphinscheduler.common.enums.UserType;
 import org.apache.dolphinscheduler.common.utils.EncryptionUtils;
@@ -800,12 +798,14 @@ public class UsersServiceImpl extends BaseServiceImpl 
implements UsersService {
      * @return user list
      */
     @Override
-    public List<User> queryUserList(User loginUser) {
+    public List<UserSimpleInfoVO> queryUserList(User loginUser) {
         // only admin can operate
-        if (!canOperatorPermissions(loginUser, null, 
AuthorizationType.ACCESS_TOKEN, USER_MANAGER)) {
+        if (!isAdmin(loginUser)) {
             throw new ServiceException(Status.USER_NO_OPERATION_PERM);
         }
-        return userDao.queryEnabledUsers();
+        return userDao.queryEnabledUsers().stream()
+                .map(UserSimpleInfoVO::new)
+                .collect(Collectors.toList());
     }
 
     /**
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/vo/UserSimpleInfoVO.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/vo/UserSimpleInfoVO.java
new file mode 100644
index 0000000000..a07158cfda
--- /dev/null
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/vo/UserSimpleInfoVO.java
@@ -0,0 +1,35 @@
+/*
+ * 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.dolphinscheduler.api.vo;
+
+import org.apache.dolphinscheduler.dao.entity.User;
+
+import lombok.Data;
+
+@Data
+public class UserSimpleInfoVO {
+
+    private Integer id;
+
+    private String userName;
+
+    public UserSimpleInfoVO(User user) {
+        this.id = user.getId();
+        this.userName = user.getUserName();
+    }
+}
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/UsersControllerTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/UsersControllerTest.java
index efc2d4cfd5..c1bf188e86 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/UsersControllerTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/UsersControllerTest.java
@@ -17,9 +17,11 @@
 
 package org.apache.dolphinscheduler.api.controller;
 
+import static org.hamcrest.Matchers.aMapWithSize;
 import static 
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
 import static 
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
 import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
 import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
 import org.apache.dolphinscheduler.api.enums.Status;
@@ -183,6 +185,9 @@ public class UsersControllerTest extends 
AbstractControllerTest {
                 .params(paramsMap))
                 .andExpect(status().isOk())
                 .andExpect(content().contentType(MediaType.APPLICATION_JSON))
+                .andExpect(jsonPath("$.data[0]", aMapWithSize(2)))
+                .andExpect(jsonPath("$.data[0].id").isNumber())
+                .andExpect(jsonPath("$.data[0].userName").isString())
                 .andReturn();
 
         Result result = 
JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), 
Result.class);
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java
index d743448879..661740a7fc 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java
@@ -30,6 +30,7 @@ import 
org.apache.dolphinscheduler.api.service.impl.BaseServiceImpl;
 import org.apache.dolphinscheduler.api.service.impl.UsersServiceImpl;
 import org.apache.dolphinscheduler.api.utils.PageInfo;
 import org.apache.dolphinscheduler.api.utils.Result;
+import org.apache.dolphinscheduler.api.vo.UserSimpleInfoVO;
 import org.apache.dolphinscheduler.common.enums.AuthorizationType;
 import org.apache.dolphinscheduler.common.enums.UserType;
 import org.apache.dolphinscheduler.common.utils.EncryptionUtils;
@@ -225,21 +226,26 @@ public class UsersServiceTest {
     @Test
     public void testQueryUserList() {
         User user = new User();
-        user.setUserType(UserType.ADMIN_USER);
+        user.setUserType(UserType.GENERAL_USER);
         user.setId(1);
 
+        // Access token permission must not grant general users access to the 
user list.
         
Mockito.when(resourcePermissionCheckService.operationPermissionCheck(AuthorizationType.ACCESS_TOKEN,
 1,
                 USER_MANAGER, serviceLogger)).thenReturn(true);
-        
Mockito.when(resourcePermissionCheckService.resourcePermissionCheck(AuthorizationType.ACCESS_TOKEN,
 null, 0,
-                serviceLogger)).thenReturn(false);
+        
Mockito.when(resourcePermissionCheckService.resourcePermissionCheck(AuthorizationType.ACCESS_TOKEN,
 null, 1,
+                serviceLogger)).thenReturn(true);
         assertThrowsServiceException(Status.USER_NO_OPERATION_PERM, () -> 
usersService.queryUserList(user));
 
         // success
+        user.setUserType(UserType.ADMIN_USER);
         
Mockito.when(resourcePermissionCheckService.resourcePermissionCheck(AuthorizationType.ACCESS_TOKEN,
 null, 0,
                 serviceLogger)).thenReturn(true);
-        when(userDao.queryEnabledUsers()).thenReturn(getUserList());
-        List<User> users = usersService.queryUserList(user);
-        Assertions.assertFalse(users.isEmpty());
+        User enabledUser = getGeneralUser();
+        enabledUser.setId(2);
+        
when(userDao.queryEnabledUsers()).thenReturn(Lists.newArrayList(enabledUser));
+        List<UserSimpleInfoVO> users = usersService.queryUserList(user);
+        Assertions.assertEquals(2, users.get(0).getId());
+        Assertions.assertEquals("userTest0001", users.get(0).getUserName());
     }
 
     @Test
diff --git 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/User.java
 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/User.java
index 827a2f575a..3f33623caa 100644
--- 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/User.java
+++ 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/User.java
@@ -27,6 +27,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 
 @Data
 @TableName("t_ds_user")
@@ -37,6 +38,7 @@ public class User {
 
     private String userName;
 
+    @JsonIgnore
     private String userPassword;
 
     private String email;
diff --git 
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/UserMapper.xml
 
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/UserMapper.xml
index 506c377f63..1d85f624bb 100644
--- 
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/UserMapper.xml
+++ 
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/UserMapper.xml
@@ -130,8 +130,7 @@
         where u.id = rel.user_id and rel.project_id = #{projectId}
     </select>
     <select id="queryEnabledUsers" 
resultType="org.apache.dolphinscheduler.dao.entity.User">
-        select
-        <include refid="baseSql"/>
+        select id, user_name
         from t_ds_user
         where state = 1
     </select>
diff --git a/dolphinscheduler-ui/src/service/modules/users/types.ts 
b/dolphinscheduler-ui/src/service/modules/users/types.ts
index 26b6629515..a590980e47 100644
--- a/dolphinscheduler-ui/src/service/modules/users/types.ts
+++ b/dolphinscheduler-ui/src/service/modules/users/types.ts
@@ -97,18 +97,6 @@ interface UserInfoRes extends UserReq, IdReq {
 interface UserListRes {
   id: number
   userName: string
-  userPassword: string
-  email: string
-  phone: string
-  userType: string
-  tenantId: number
-  state: number
-  tenantCode?: any
-  queueName?: any
-  alertGroup?: any
-  queue: string
-  createTime: string
-  updateTime: string
 }
 
 export {

Reply via email to