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,寫相應的代碼訪問本身的權限管理系統也無大礙
相關文章
相關標籤/搜索