用户和组的关系(即“谁属于哪个部门/角色”)是在 Flowable 的身份管理 (Identity Management) 模块中处理的。
Flowable 提供了两种主要的解决方案来处理这个问题,您需要根据项目情况选择其一。
方案一:使用 Flowable 内置的身份管理系统(基本没人用可以直接不看)
这是最简单、最适合入门和快速原型开发的方式。 Flowable UI 套件中自带了一个完整的用户和组管理应用。
- 在哪里处理?
在 Flowable UI 主界面,点击名为 Flowable Identity Management 的应用图标(通常是一个人像图标)。
(这是Flowable UI主界面,红框标注了身份管理应用)
进入该应用后,您会看到左侧菜单有两个核心选项:
用户 (Users):管理单个用户账户。
组 (Groups):管理角色、部门、团队等。 - 如何操作?
第一步:创建组 (Groups)
点击左侧菜单的 “组 (Groups)”。
点击 “创建组 (Create group)” 按钮。
在弹出的对话框中,填写 ID (例如 managers) 和 名称 (Name) (例如 经理组)。
点击 “创建 (Create)”。
重复此步骤,创建所有您需要的角色组,如 finance (财务部), hr (人力资源部) 等。
第二步:创建用户 (Users)
点击左侧菜单的 “用户 (Users)”。
点击 “创建用户 (Create user)” 按钮。
填写用户的详细信息,如 ID (登录名,如 zhangsan)、密码、名字、姓氏、邮箱等。
第三步:建立用户和组的关联关系 (Membership)
这是最关键的一步,它回答了“谁在哪个组里”的问题。
回到 “用户 (Users)” 列表,找到并点击您想操作的用户(例如 zhangsan)。
进入用户详情页面后,找到并点击 “组 (Groups)” 选项卡。
您会看到一个 “添加组 (Add group)” 的输入框。
在输入框中输入您想将该用户加入的组的ID(例如 managers),系统会自动搜索并提示。
选中 managers 组并添加。
现在,zhangsan 就正式成为 managers 组的一员了。
(这是一个模拟图,展示了如何将用户添加到组中)
数据存储在哪里?
所有这些信息都保存在 Flowable 的数据库中,主要涉及以下三张表:
ACT_ID_USER:存储用户信息。
ACT_ID_GROUP:存储组信息。
ACT_ID_MEMBERSHIP:存储用户和组的多对多关系,这是核心的关联表。
方案二:集成企业已有的外部身份系统(生产环境首选)
在真实的企业项目中,99% 的情况下,公司已经有了一套统一的用户认证和权限管理系统(例如基于 Spring Security、LDAP、OAuth2、或者自有的用户中心)。在这种情况下,再让 Flowable 维护一套独立的用户体系是不可接受的,会导致数据冗余和管理混乱。
核心思想:Flowable 不需要 存储用户和组的数据,它只需要一个“适配器”来在需要时查询您现有系统的数据。
1. 如何实现?
您需要自己编写一些Java配置代码,来“告诉”Flowable 如何从您的系统中获取用户和组的信息。
第一步:禁用 Flowable 的内置身份管理模块
在您的 Spring Boot 项目的 application.properties 中添加配置:
# 禁用Flowable自带的IDM,这样就不会创建ACT_ID_*相关表
flowable.idm.enabled=false
第二步:实现自定义的用户/组查询逻辑
这通常需要您创建自定义的 UserEntityManager 和 GroupEntityManager,并将其注入到 Flowable 的流程引擎配置中。
简化版示例(以集成 Spring Security 为例):
假设您的 Spring Security 提供了 UserDetailsService 来加载用户信息和角色。
@Configuration
public class MyFlowableIdentityConfiguration {
// 这是一个简化的示例,旨在说明原理
@Bean
public EngineConfigurationConfigurer<SpringProcessEngineConfiguration> customIdentityConfigurer(MyUserGroupService myUserGroupService) {
return engineConfiguration -> {
// 设置自定义的身份管理实现
engineConfiguration.setUserEntityManager(new CustomUserEntityManager(engineConfiguration, myUserGroupService));
engineConfiguration.setGroupEntityManager(new CustomGroupEntityManager(engineConfiguration, myUserGroupService));
};
}
}
// CustomGroupEntityManager 的核心是实现 findGroupsByUser 方法
public class CustomGroupEntityManager extends GroupEntityManagerImpl {
private MyUserGroupService myUserGroupService;
public CustomGroupEntityManager(ProcessEngineConfigurationImpl processEngineConfiguration, MyUserGroupService myUserGroupService) {
super(processEngineConfiguration, null);
this.myUserGroupService = myUserGroupService;
}
@Override
public List<Group> findGroupsByUser(String userId) {
// !!! 核心逻辑在这里 !!!
// 调用你自己的服务,从你的用户系统查询该用户所属的角色/组
List<String> groupIds = myUserGroupService.findGroupIdsByUserId(userId);
// 将查询到的组ID列表,转换成Flowable认识的Group对象列表
return groupIds.stream()
.map(groupId -> {
GroupEntityImpl group = new GroupEntityImpl();
group.setId(groupId);
group.setName(groupId); // 通常ID和Name可以一样
return group;
})
.collect(Collectors.toList());
}
}
当 Flowable 需要判断任务的候选组时(例如 candidateGroups=“managers”),它会调用 findGroupsByUser 方法,询问“当前这个用户属于哪些组?”,您的自定义实现会从您的数据库中查询并告诉它,Flowable 就能正确判断该用户是否有权处理这个任务了。