You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kogito用户服务与连接器示例:自定义用户/组审批流程问询

Kogito BPMN用户任务自定义用户/组实现详解

核心运行机制

Kogito的BPMN用户任务本身不内置用户/组管理能力,必须通过外部身份服务或自定义组件提供身份数据,核心依赖两个扩展点:

  • UserGroupCallback:Kogito用于查询用户所属组、验证用户权限的核心接口
  • TaskAssignmentsSupplier:可选扩展,用于实现更复杂的动态任务分配逻辑

实现步骤与示例

1. 自定义UserGroupCallback实现

这是最基础的实现方式,直接实现Kogito提供的UserGroupCallback接口,替换默认的空实现。

import org.kie.kogito.process.workitem.UserGroupCallback;
import javax.enterprise.context.ApplicationScoped;
import java.util.Collections;
import java.util.Set;

@ApplicationScoped
public class CustomUserGroupCallback implements UserGroupCallback {

    // 验证用户是否存在(对接外部服务或数据库实现)
    @Override
    public boolean existsUser(String userId) {
        // 示例:仅允许指定用户
        return "requester001".equals(userId) || "approver001".equals(userId);
    }

    // 验证组是否存在
    @Override
    public boolean existsGroup(String groupId) {
        return "dept-manager".equals(groupId) || "finance-audit".equals(groupId);
    }

    // 获取用户所属的所有组
    @Override
    public Set<String> getGroupsForUser(String userId, Set<String> groupIds) {
        if ("requester001".equals(userId)) {
            return Collections.singleton("finance-audit");
        } else if ("approver001".equals(userId)) {
            return Collections.singleton("dept-manager");
        }
        return Collections.emptySet();
    }
}

2. BPMN流程中配置用户任务

在BPMN文件中直接指定用户或组,Kogito会自动调用上述自定义的CustomUserGroupCallback做验证和分配:

<bpmn2:userTask id="expenseApproveTask" name="费用审批">
  <bpmn2:incoming>Flow_1</bpmn2:incoming>
  <bpmn2:outgoing>Flow_2</bpmn2:outgoing>
  <bpmn2:potentialOwner>
    <bpmn2:resourceAssignmentExpression>
      <bpmn2:formalExpression>dept-manager</bpmn2:formalExpression>
    </bpmn2:resourceAssignmentExpression>
  </bpmn2:potentialOwner>
</bpmn2:userTask>

如果需要从流程变量动态获取审批人,可使用表达式:

<bpmn2:formalExpression>${approvalUserId}</bpmn2:formalExpression>

3. 动态任务分配进阶(TaskAssignmentsSupplier)

若需根据流程数据动态计算审批人(比如按费用金额区分审批层级),可实现TaskAssignmentsSupplier:

import org.kie.kogito.process.workitem.TaskAssignments;
import org.kie.kogito.process.workitem.TaskAssignmentsSupplier;
import javax.enterprise.context.ApplicationScoped;
import java.util.Collections;

@ApplicationScoped
public class DynamicAssignmentSupplier implements TaskAssignmentsSupplier {

    @Override
    public TaskAssignments getAssignments(String processId, String taskId, String phase, Object parameters) {
        // 根据流程ID、任务ID和流程参数动态分配
        if ("expenseProcess".equals(processId) && "expenseApproveTask".equals(taskId)) {
            Expense expense = (Expense) parameters;
            if (expense.getAmount() > 10000) {
                // 大额费用需总监审批
                return TaskAssignments.ofUsers(Collections.singleton("director001"));
            } else {
                // 小额费用由部门经理审批
                return TaskAssignments.ofGroups(Collections.singleton("dept-manager"));
            }
        }
        return TaskAssignments.empty();
    }
}

关键注意事项

  • 优先级:TaskAssignmentsSupplier的返回结果会覆盖BPMN文件中配置的用户/组
  • 外部服务集成:若需对接Keycloak、LDAP等外部用户服务,只需在UserGroupCallback的实现中调用对应服务API即可
  • 权限验证:Kogito会在任务分配和认领阶段自动调用existsUser/existsGroup做合法性校验

内容的提问来源于stack exchange,提问作者Ks Tan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:20:27