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
相关产品推荐
相关产品推荐

