Flowable自定义权限

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

官方之因此将IDM拆分出来,一个是由于IDM模块并非核心的模块,另外在不少使用Flowable的场景中,权限管理并不须要,或者大多使用权限的时候须要咱们使用本身的权限模块,而不是默认的实现。api

默认实现

Flowable默认提供了两种方式能够处理权限相关:bash

1 经过IdentityService,这个服务主要用来管理用户和组,不能操做具体的权限。是简单版数据结构

processEngine.getIdentityService();
复制代码

2 经过IdmIdentityService,能够用户和组,同时能够处理具体的权限(Privilege),在IdentityService之上作了加强,但二者是不一样的接口。app

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就知足不了咱们的操做。ui

user -> userspa

group -> role设计

PRIV -> access controlcode

自定义权限管理

若是咱们以为默认的权限管理知足不了咱们的须要,或者已经有本身的权限管理系统,则须要额外处理。有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,写相应的代码访问本身的权限管理系统也无大碍
相关文章
相关标签/搜索