update 优化 校验当前登录用户是否可以读取任务信息

This commit is contained in:
疯狂的狮子Li 2026-08-28 13:47:58 +08:00
parent 0498ba2e41
commit a5436dea67

View File

@ -1,5 +1,7 @@
package org.dromara.workflow.service.impl; package org.dromara.workflow.service.impl;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
@ -81,6 +83,13 @@ import static org.dromara.workflow.common.constant.FlowConstant.*;
@Service @Service
public class FlwTaskServiceImpl implements IFlwTaskService { public class FlwTaskServiceImpl implements IFlwTaskService {
private static final Set<String> TASK_READ_ASSIGNEE_TYPES = Set.of(
TaskAssigneeType.APPROVER.getCode(),
TaskAssigneeType.TRANSFER.getCode(),
TaskAssigneeType.DELEGATE.getCode(),
TaskAssigneeType.COPY.getCode()
);
private final TaskService taskService; private final TaskService taskService;
private final InsService insService; private final InsService insService;
private final DefService defService; private final DefService defService;
@ -699,6 +708,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
if (ObjectUtil.isNull(task)) { if (ObjectUtil.isNull(task)) {
return null; return null;
} }
checkTaskReadAccess(task);
FlowTaskVo flowTaskVo = BeanUtil.toBean(task, FlowTaskVo.class); FlowTaskVo flowTaskVo = BeanUtil.toBean(task, FlowTaskVo.class);
Instance instance = insService.getById(task.getInstanceId()); Instance instance = insService.getById(task.getInstanceId());
if (ObjectUtil.isNull(instance)) { if (ObjectUtil.isNull(instance)) {
@ -960,14 +970,62 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
*/ */
@Override @Override
public List<UserDTO> currentTaskAllUser(List<Long> taskIds) { public List<UserDTO> currentTaskAllUser(List<Long> taskIds) {
if (CollUtil.isEmpty(taskIds)) {
return Collections.emptyList();
}
List<Long> validTaskIds = new ArrayList<>();
for (Long taskId : taskIds) {
if (ObjectUtil.isNull(taskId)) {
continue;
}
Task task = taskService.getById(taskId);
if (ObjectUtil.isNotNull(task)) {
checkTaskReadAccess(task);
validTaskIds.add(taskId);
}
}
if (CollUtil.isEmpty(validTaskIds)) {
return Collections.emptyList();
}
// 获取与当前任务关联的用户列表 // 获取与当前任务关联的用户列表
List<User> userList = FlowEngine.userService().getByAssociateds(taskIds); List<User> userList = FlowEngine.userService().getByAssociateds(validTaskIds);
if (CollUtil.isEmpty(userList)) { if (CollUtil.isEmpty(userList)) {
return Collections.emptyList(); return Collections.emptyList();
} }
return userService.selectListByIds(StreamUtils.toList(userList, e -> Convert.toLong(e.getProcessedBy()))); return userService.selectListByIds(StreamUtils.toList(userList, e -> Convert.toLong(e.getProcessedBy())));
} }
/**
* 校验当前登录用户是否可以读取任务信息
*
* <p>任务读取接口同时服务于普通审批和流程监控不能只依赖管理菜单权限
* 普通用户必须是任务办理关系人流程发起人或抄送接收人监控/管理角色
* 通过任务列表或编辑权限进入管理读取范围</p>
*
* @param task 当前任务
*/
private void checkTaskReadAccess(Task task) {
if (LoginHelper.isSuperAdmin()
|| StpUtil.hasPermission("workflow:task:list")
|| StpUtil.hasPermission("workflow:task:edit")) {
return;
}
String userId = LoginHelper.getUserIdStr();
List<User> associatedUsers = FlowEngine.userService().getByAssociateds(List.of(task.getId()));
boolean taskAssignee = CollUtil.isNotEmpty(associatedUsers)
&& associatedUsers.stream()
.anyMatch(user -> Objects.equals(userId, user.getProcessedBy())
&& TASK_READ_ASSIGNEE_TYPES.contains(Convert.toStr(user.getType())));
if (taskAssignee) {
return;
}
Instance instance = insService.getById(task.getInstanceId());
if (ObjectUtil.isNotNull(instance) && Objects.equals(instance.getCreateBy(), userId)) {
return;
}
throw new NotPermissionException("无权访问该流程任务");
}
/** /**
* 按照节点编码查询节点 * 按照节点编码查询节点
* *