身份服务 Identity Service
身份服务是对各种用户/组库的API抽象。其基本实体是:
- User: 使用不同ID区分的不同用户
- Group: 使用不同ID区分的不同组
- Membership: 组与用户之间的关系
- Tenant: 使用不同ID区分的不同租户
- Tenant Membership: 租户与 用户/组 之间的关系
实例:
User demoUser = processEngine.getIdentityService()
.createUserQuery()
.userId("demo")
.singleResult();
Camunda平台区分了只读和可写的用户资源库。只读的用户资源库提供对基础用户/组数据库的只读访问。可写用户资源库允许对用户数据库进行写访问,包括创建、更新和删除用户和组。
也提供一个自定义的身份提供者实现,可以实现如下接口:
- org.camunda.bpm.engine.impl.identity.ReadOnlyIdentityProvider
- org.camunda.bpm.engine.impl.identity.WritableIdentityProvider
用户、组和租户ID的自定义白名单
用户、组和租户ID可以与白名单相匹配,以确定所提供的ID是否可以接受。默认的(全局)正则表达式匹配模式是 “[a-zA-Z0-9]+|camunda-admin “ ,即任何字母数字值的组合或 ‘camunda-admin’ 。
如果你的组织允许使用额外的字符(例如:特殊字符),应该在流程引擎的配置文件ProcessEngineConfiguration属性generalResourceWhitelistPattern
中设置适当的模式。可以使用标准的Java 正则表达式语法。例如,要接受所有字符,可以使用以下属性值。
<property name="generalResourceWhitelistPattern" value=".+"/>
通过使用适当的配置方式,可以为用户、组和租户ID定义不同的匹配模式。
<property name="userResourceWhitelistPattern" value="[a-zA-Z0-9-]+" />
<property name="groupResourceWhitelistPattern" value="[a-zA-Z]+" />
<property name="tenantResourceWhitelistPattern" value=".+" />
请注意,如果没有定义某种模式(例如租户白名单模式),将使用一般模式,要么是默认模式("[a-zA-Z0-9]+|camunda-admin"
),要么是配置文件中定义的。
基于数据库的身份服务
数据库身份服务使用流程引擎数据库来管理用户和组。如果没有提供其他身份服务实现,这是默认的身份服务实现。
数据库身份服务同时实现了 “只读身份提供者” 和 “可写身份提供者”,在用户、组和会员中提供完整的CRUD功能。
基于 LDAP 的身份服务
LDAP身份服务提供对基于LDAP的用户/组资源库的只读访问。该身份服务提供方式作为流程引擎插件实现,可以被添加到流程引擎配置中。添加后,它会取代默认的数据库身份服务。
使用LDAP身份服务,需要将camunda-identity-ldap.jar
库添加到流程引擎的classloader中。
请导入Camunda BOM,以确保每个Camunda项目的版本正确。
<dependency>
<groupId>org.camunda.bpm.identity</groupId>
<artifactId>camunda-identity-ldap</artifactId>
</dependency>
激活LDAP插件
以下是如何使用 Spring XML 配置 LDAP Identity Provider Plugin 的示例:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="processEngineConfiguration" class="org.camunda.bpm.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
...
<property name="processEnginePlugins">
<list>
<ref bean="ldapIdentityProviderPlugin" />
</list>
</property>
</bean>
<bean id="ldapIdentityProviderPlugin" class="org.camunda.bpm.identity.impl.ldap.plugin.LdapIdentityProviderPlugin">
<property name="serverUrl" value="ldap://localhost:3433/" />
<property name="managerDn" value="uid=daniel,ou=office-berlin,o=camunda,c=org" />
<property name="managerPassword" value="daniel" />
<property name="baseDn" value="o=camunda,c=org" />
<property name="userSearchBase" value="" />
<property name="userSearchFilter" value="(objectclass=person)" />
<property name="userIdAttribute" value="uid" />
<property name="userFirstnameAttribute" value="cn" />
<property name="userLastnameAttribute" value="sn" />
<property name="userEmailAttribute" value="mail" />
<property name="userPasswordAttribute" value="userpassword" />
<property name="groupSearchBase" value="" />
<property name="groupSearchFilter" value="(objectclass=groupOfNames)" />
<property name="groupIdAttribute" value="ou" />
<property name="groupNameAttribute" value="cn" />
<property name="groupMemberAttribute" value="member" />
<property name="authorizationCheckEnabled" value="false" />
</bean>
</beans>
以下是如何在 bpm-platform.xml/processes.xml 中配置 LDAP Identity Provider Plugin 的示例:
<process-engine name="default">
<job-acquisition>default</job-acquisition>
<configuration>org.camunda.bpm.engine.impl.cfg.StandaloneProcessEngineConfiguration</configuration>
<datasource>java:jdbc/ProcessEngine</datasource>
<properties>...</properties>
<plugins>
<plugin>
<class>org.camunda.bpm.identity.impl.ldap.plugin.LdapIdentityProviderPlugin</class>
<properties>
<property name="serverUrl">ldap://localhost:4334/</property>
<property name="managerDn">uid=jonny,ou=office-berlin,o=camunda,c=org</property>
<property name="managerPassword">s3cr3t</property>
<property name="baseDn">o=camunda,c=org</property>
<property name="userSearchBase"></property>
<property name="userSearchFilter">(objectclass=person)</property>
<property name="userIdAttribute">uid</property>
<property name="userFirstnameAttribute">cn</property>
<property name="userLastnameAttribute">sn</property>
<property name="userEmailAttribute">mail</property>
<property name="userPasswordAttribute">userpassword</property>
<property name="groupSearchBase"></property>
<property name="groupSearchFilter">(objectclass=groupOfNames)</property>
<property name="groupIdAttribute">ou</property>
<property name="groupNameAttribute">cn</property>
<property name="groupMemberAttribute">member</property>
<property name="authorizationCheckEnabled">false</property>
</properties>
</plugin>
</plugins>
</process-engine>
管理员授权插件
LDAP Identity Provider Plugin 通常与Administrator Authorization Plugin 结合使用 它允许你为特定的 LDAP用户/组 授予管理员权限。
多租户
目前,LDPA 身份服务不支持 多租户。 这意味着无法从 LDAP 获取租户,并且默认情况下透明的多租户访问限制不起作用。
LDAP 插件的可配置属性
LDAP身份提供程序提供以下可配置属性:
属性 | 描述 |
---|---|
serverUrl |
要连接的 LDAP 服务器的 URL。 |
managerDn |
LDAP目录管理员用户的managerDn。 |
managerPassword |
LDAP目录管理员用户密码 |
baseDn |
base DN:标识 LDAP 目录的根。 附加到为搜索用户或组而组成的所有 DN 名称。 例如: |
userSearchBase |
标识 LDAP树 中插件应在其下搜索用户的节点。必须对应
例如: |
userSearchFilter |
搜索用户时使用的 LDAP 查询字符串。 例如: |
userIdAttribute |
用户ID属性的名称。 例如: |
userFirstnameAttribute |
firstname 属性的名称。例如: |
userLastnameAttribute |
lastname 属性的名称。例如: |
userEmailAttribute |
email 属性的名称 例如: |
userPasswordAttribute |
password 属性的名称 例如: |
groupSearchBase |
标识 LDAP 树中插件应在其下搜索组的节点。 必须对应
例如: |
groupSearchFilter |
搜索组时使用的 LDAP 查询字符串。 例如: |
groupIdAttribute |
组 Id 属性的名称。 例如: |
groupNameAttribute |
组 Name 属性的名称。 例如: |
groupTypeAttribute |
组 Type 属性的名称。 例如: |
groupMemberAttribute |
成员属性的名称。 例如: |
acceptUntrustedCertificates |
如果 LDAP 服务器使用 SSL,则接受不被信任的证书。 警告: 我们强烈建议不要使用此属性。 最好将不被信任的证书安装到 JDK 密钥库。 |
useSsl |
如果 LDAP 连接使用 SSL,则设置为 true。 默认: |
initialContextFactory |
|
securityAuthentication |
|
usePosixGroups |
表示是否使用 posix 组。 如果为 true,当按组成员而不是完整 DN 查询组时,连接器将使用一个简单的(非限定)用户 ID。
默认: |
allowAnonymousLogin |
允许匿名登录,无需密码。 默认: 警告: 我们强烈建议不要使用此属性。 你应该配置你的 LDAP 使用无需匿名登录的简单身份验证。 |
authorizationCheckEnabled |
如果这个属性设置为
注意: 如果你有大量 LDAP 用户或组,我们建议将此属性设置为 |
sortControlSupported |
如果此属性设置为 注意: 搜索结果排序的支持并不是每个 LDAP 服务器都实现的。 确保你当前使用的 LDAP 服务器实现了 RFC 2891。 |
限制登录尝试
存在一种机制来防止后续不成功的登录尝试。其本质是用户在登录尝试不成功后的特定时间内无法登录。 每次尝试后都会计算时间量,但受最大延迟时间限制。 在预定义的失败尝试次数后,用户将被锁定,只有管理员有权解锁 他们。
该机制可以使用以下属性和它们的默认值进行配置。
loginMaxAttempts=10
loginDelayFactor=2
loginDelayMaxTime=60
loginDelayBase=3
有关更多信息,请查看流程引擎的 登录属性 部分。
延迟的计算通过以下公式完成:baseTime * factor^(attempt-1)
。
默认配置的行为将是:
第一次尝试失败后延迟 3 秒,第二次尝试后延迟 6 秒,12 秒、24 秒、48 秒、60 秒、60 秒等。 第 10 次尝试后,如果用户再次登录失败,用户将被锁定。
LDAP 细节
如果你的引擎上有 LDAP 设置,则需要处理 LDAP 端的限制。 你系统中的登录机制不会受到上述属性的影响。