Flowable自定义权限

7,508 阅读4分钟

Flowable默认提供了一套自己的权限管理接口(IDM),但是从Flowable 6开始,IDM的组件被独立出来,分为几个不同的模块:flowable-idm-api, flowable-idm-engine, flowable-idm-spring 和 flowable-idm-engine-configurator。

官方之所以将IDM拆分出来,一个是因为IDM模块并不是核心的模块,另外在很多使用Flowable的场景中,权限管理并不需要,或者大多使用权限的时候需要我们使用自己的权限模块,而不是默认的实现。

默认实现

Flowable默认提供了两种方式可以处理权限相关:

1 通过IdentityService,这个服务主要用来管理用户和组,不能操作具体的权限。是简单版

processEngine.getIdentityService();

2 通过IdmIdentityService,可以用户和组,同时可以处理具体的权限(Privilege),在IdentityService之上做了增强,但两者是不同的接口。

IdmEngineConfigurator idmEngineConfigurator = new IdmEngineConfigurator();
cfg.setIdmEngineConfigurator(idmEngineConfigurator);
// 会初始化processEngine,同时初始化配置在里面的Configurator,如IdmEngineConfigurator
ProcessEngine processEngine = cfg.buildProcessEngine();
IdmIdentityService idmIdentityService = idmEngineConfigurator.getIdmEngineConfiguration().getIdmIdentityService();

两个服务用到的是Flowable中相同的表:

  • ACT_ID_USER 存储的用户,调用saveUser接口会存储在里面
  • ACT_ID_INFO 存储用户的属性信息,setUserInfo接口的时候设置一key,value信息存储在其中
  • ACT_ID_GROUP 存储新创建的Flowable组信息,saveGroup会存储在其中
  • ACT_ID_MEMBERSHIP 用户和组的关系会存在里面,用户和组可以多对多
  • ACT_ID_PRIV 存储可以使用的权限,createPrivilege会新增一条记录
  • ACT_ID_PRIV_MAPPING 存储用户id或组id与权限的映射关系,addGroupPrivilegeMapping或者addUserPrivilegeMapping会新增一台记录
  • ACT_ID_TOKEN 用户相关Token,saveToken会新存储一条记录

**备注:**可以看出来,Flowable官方提供的IDM在一定程度上也可以进行RBAC(Role-Based Access Control)的操作,只是权限管理会复杂一点的时候,IDM就满足不了我们的操作。

user -> user

group -> role

PRIV -> access control

自定义权限管理

如果我们觉得默认的权限管理满足不了我们的需要,或者已经有自己的权限管理系统,则需要额外处理。有2种可以与自己业务兼容的方案:

  • 方案一:同步自己的权限表信息,适配Flowable的表结构,仍然使用IDM提供的服务接口去操作
    • 优点:对Flowable没有侵入性,不需要引入额外的内容
    • 缺点:已经有权限管理系统的时候,如果存在两份数据可能有数据不一致的现象,增加额外的数据维护
  • 方案二:自己写代码,实现IdmIdentityService接口,处理自己的权限管理逻辑。官方提供了可以直接使用的LDAP集成方案,我们不一定使用LDAP,但是其中的代码实现比较经典,可以参考一下。
    • 优点:自定义实现,灵活,不管什么权限系统都可以写适配
    • 缺点:如果其他组想接入Flowable,需要引入我们的权限控制实现。

方案一

我们在上面已经说过Flowable权限管理的几张表的内容,按结构将我们的权限数据导入其中即可。但考虑到数据方面内容,可能也需要一定的代码开发量。

注意:

  • 数据结构兼容性
  • 数据的一致性,权限数据更新需通知,或定时拉取权限数据

方案二

官方的IDM模块以及被单独拆分出来,我们的实现的代码不会对Flowable的工作量有影响,另外IDM模块,只需要关心能否提供权限控制即可。

以LDAP为例,在使用的时候只需使用正确的IDM配置器即可:

// 只需改动这一行的配置器即可
IdmEngineConfigurator idmEngineConfigurator = new LDAPConfigurator();
cfg.setIdmEngineConfigurator(idmEngineConfigurator);
    
ProcessEngine processEngine = cfg.buildProcessEngine();
IdmIdentityService idmIdentityService = idmEngineConfigurator.getIdmEngineConfiguration().getIdmIdentityService();
实现

根据自己的业务需要,提供用户的管理功能。关键部分:

  • 配置IdmEngineConfiguration参数
  • 实现IdmIdentityService,可继承IdmIdentityServiceImpl
  • 实现UserQuery,可继承UserQueryImpl
  • 实现GroupQuery,可继承GroupQueryImpl
  • 实现PrivilegeQuery,可继承PrivilegeQueryImpl

如果我们的已经有自己的权限管理系统,在一定程度上相当于做自己的权限管理系统的客户端。

小结

在业务发展一段时间后引入工作流,采用第二种方案更合适一些。

  • 如果将自己的权限系统数据导入到Flowable的表中,在分布式系统中相当于两份权限管理,Flowable一份,自己的权限管理一份。
  • 已经存在权限管理服务的时候,主要就是供客户端使用,将Flowable的权限管理部分作为自己权限管理的客户端更符合分布式的设计,分布式系统中只有一个系统提供一种类型的服务,供其它系统使用
  • 至于LDAP,也是一种权限管理的方案,如果内部有LDAP可以直接使用LDAP,如果没有LDAP,写相应的代码访问自己的权限管理系统也无大碍