跳到主要内容

身份管理

Doubao 中英对照 Identity management

从 Flowable V6 开始,身份管理(IDM)组件已从 flowable-engine 模块中拆出,相关逻辑被移到了几个独立的模块中:flowable-idm-api、flowable-idm-engine、flowable-idm-spring 和 flowable-idm-engine-configurator。将 IDM 逻辑分离出来的主要原因是,它并非 Flowable 引擎的核心;在很多将 Flowable 引擎嵌入应用程序的场景中,这些身份逻辑并不被使用或需要。

默认情况下,当 Flowable 引擎启动时,IDM 引擎也会被初始化并启动。这使得与 Flowable v5 中相同的身份逻辑得以执行并可用。idm-engine 管理自己的数据库模式(schema)和以下实体:

  • User 和 UserEntity:用户信息。
  • Group 和 GroupEntity:组信息。
  • MembershipEntity:用户在组中的成员关系。
  • Privilege 和 PrivilegeEntity:权限定义(例如用于控制对 UI 应用程序的访问,如 Flowable Modeler 和 Flowable Task 应用)。
  • PrivilegeMappingEntity:将用户和/或组关联到权限。
  • Token 和 TokenEntity:UI 应用程序使用的认证令牌。

由于数据库中既包含历史实例实体,也包含正在运行的实例实体,你可能需要考虑查询这些表,以尽量减少对运行时流程实例数据的访问,从而保证运行时执行的性能。

IDM 引擎配置​

默认情况下,Flowable 引擎使用 org.flowable.idm.engine.configurator.IdmEngineConfigurator 启动。该 configurator 使用与 Flowable 流程引擎配置相同的数据源配置。无需额外配置即可使用与 Flowable v5 中相同配置的身份组件。

当 Flowable 引擎中不需要身份逻辑时,可以在流程引擎配置中禁用 IDM 引擎。

<bean id="processEngineConfiguration" class="org.flowable.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
<property name="disableIdmEngine" value="true" />
...
</bean>

这意味着将无法使用用户和组查询,也无法为用户检索任务查询中的候选组。

默认情况下,用户密码将以明文形式保存在 IDM 数据库表中。为确保密码经过编码,你可以在流程引擎配置中定义一个密码编码器(password encoder)。

<bean id="bCryptEncoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

<bean id="passwordEncoder" class="org.flowable.idm.spring.authentication.SpringEncoder">
<constructor-arg ref="bCryptEncoder"/>
</bean>

<bean id="processEngineConfiguration" class="org.flowable.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
<property name="passwordEncoder" ref="passwordEncoder" />
...
</bean>

在本例中使用的是 ShaPasswordEncoder,但你也可以使用例如 org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder。在不使用 Spring 的情况下,你也可以使用 org.flowable.idm.engine.impl.authentication.ApacheDigester 来对密码进行编码。

默认的 IDM 引擎 configurator 也可以被覆盖,从而以自定义方式初始化 IDM 引擎。一个很好的例子是 LDAPConfigurator
实现,它覆盖了默认的 IDM 引擎,使用 LDAP 服务器而不是默认的 IDM 数据库表。可以使用流程引擎配置的 idmProcessEngineConfigurator 属性来设置像 LDAPConfigurator 这样的自定义 configurator。

<bean id="processEngineConfiguration" class="...SomeProcessEngineConfigurationClass">
...
<property name="idmProcessEngineConfigurator">
<bean class="org.flowable.ldap.LDAPConfigurator">

<!-- Server connection params -->
<property name="server" value="ldap://localhost" />
<property name="port" value="33389" />
<property name="user" value="uid=admin, ou=users, o=flowable" />
<property name="password" value="pass" />

<!-- Query params -->
<property name="baseDn" value="o=flowable" />
<property name="queryUserByUserId" value="(&(objectClass=inetOrgPerson)(uid={0}))" />
<property name="queryUserByFullNameLike" value="(&(objectClass=inetOrgPerson)(|({0}=*{1}*)({2}=*{3}*)))" />
<property name="queryGroupsForUser" value="(&(objectClass=groupOfUniqueNames)(uniqueMember={0}))" />

<!-- Attribute config -->
<property name="userIdAttribute" value="uid" />
<property name="userFirstNameAttribute" value="cn" />
<property name="userLastNameAttribute" value="sn" />
<property name="userEmailAttribute" value="mail" />


<property name="groupIdAttribute" value="cn" />
<property name="groupNameAttribute" value="cn" />

</bean>
</property>
</bean>