返回介绍

17.集成 LDAP

发布于 2019-10-28 05:33:29 字数 8483 浏览 1182 评论 0 收藏 0

企业通常已经在 LDAP 系统各种保存了用户和群组信息。 自从 5.14 版本开始,Activiti 提供了一种解决方案, 通过简单的配置就可以告知 activiti 如何连接 LDAP。

在 Activiti 5.14 之前,Activiti 就已经可以集成 LDAP 了。 然后,5.14 的配置简单了很多。 不过,配置 LDAP 的 老 办法依然有效。更确切的说, 简化的配置其实是基于 老 方法的封装。

用法

要想在你的项目中集成 LDAP, 在 pom.xml 中添加如下依赖:

<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-ldap</artifactId>
<version>latest.version</version>
</dependency>

用例

集成 LDAP 目前有两大用例:

  • 通过 IdentityService 进行认证。比如,使用 Activiti Explorer 通过 LDAP 登录。
  • 获得用户的组。这在查询用户可以看到哪些任务时非常重要。 (比如,任务分配给一个候选组)。

配置

集成 LDAP 是通过向流程引擎配置章节中的 configurators 注入 org.activiti.ldap.LDAPConfigurator 的实例来实现的。 这个类是高度可扩展的: 如果默认的实现不符合用例的话, 可以很容易的重写方法,很多依赖的 bean 都是可插拔的。

这时一个实例配置(注意:当然, 通过代码创建引擎时,是非常简单的)。 现在不用担心所有参数,我们会在下一章详细讨论。

    <bean class="...SomeProcessEngineConfigurationClass">
...
<property name="configurators">
<list>
<bean class="org.activiti.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=activiti" />
<property name="password" value="pass" />

<!-- Query params -->
<property name="baseDn" value="o=activiti" />
<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="groupIdAttribute" value="cn" />
<property name="groupNameAttribute" value="cn" />

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

属性

下面是 org.activiti.ldap.LDAPConfigurator 可以配置的属性:

Table 17.1.LDAP 配置属性

属性名描述类型默认值
serverLDAP 服务器地址。比如'ldap://localhost:33389'String 
portLDAP 运行的端口int 
user连接 LDAP 使用的账号String 
password连接 LDAP 使用的密码String 
initialContextFactory连接 LDAP 使用的 InitialContextFactory 名称Stringcom.sun.jndi.ldap.LdapCtxFactory
securityAuthentication连接 LDAP 时设置的'java.naming.security.authentication'属性值Stringsimple
customConnectionParameters可以设置那些没有对应 setter 的连接参数。 参考 http://docs.oracle.com/javase/tutorial/jndi/ldap/jndi.html 中的自定义属性。 这些属性用来配置连接池,特定的安全设置,等等。 所有提供的参数都会用来创建 LDAP 连接。Map<String, String> 
baseDn搜索用户和组的基“显著名称”(DN)String 
userBaseDn搜索用户基于的'distinguished name' (DN)。如果没有提供,会使用 baseDn(参考上面)String 
groupBaseDn搜索群组基于的'distinguished name' (DN)。如果没有提供,会使用 baseDn(参考上面)String 
searchTimeLimit搜索 LDAP 的超时时间,单位毫秒。long一小时
queryUserByUserId使用用户 id 搜索用户的查询语句。 比如:(&(objectClass=inetOrgPerson)(uid={0})) 这里,LDAP 中所有包含'inetOrgPerson'类的 匹配'uid'属性的值都会返回。 如例子中所示,{0}会被用户 id 替换。 如果只设置一个查询无法满足特定的 LDAP 设置, 可以选择使用 LDAPQueryBuilder, 这样就会提供比单纯使用查询增加更多功能。string 
queryUserByFullNameLike使用全名搜索用户的查询语句。 比如:(& (objectClass=inetOrgPerson) (|({0}=*{1}*)({2}=*{3}*)) ) 这里,LDAP 中所有包含'inetOrgPerson'类的 匹配 first name 和 last name 的值都会返回。 注意{0}会替换为 firstNameAttribute(如上所示),{1}和{3}是搜索内容, {2}是 lastNameAttribute。 如果只设置一个查询无法满足特定的 LDAP 设置, 可以选择使用 LDAPQueryBuilder, 这样就会提供比单纯使用查询增加更多功能。string 
queryGroupsForUser使用搜索指定用户的组的查询语句。 比如:(&(objectClass=groupOfUniqueNames)(uniqueMember={0})) 这里,LDAP 中所有包含'groupOfUniqueNames'类的 提供的 DN(匹配用户的 DN)是'uniqueMember'的记录都会返回。 像例子中演示的那样,{0}会替换为用户 id。 如果只设置一个查询无法满足特定的 LDAP 设置, 可以选择使用 LDAPQueryBuilder, 这样就会提供比单纯使用查询增加更多功能。string 
userIdAttribute匹配用户 id 的属性名。 这个属性用来在查找用户对象时 关联 LDAP 对象与 Activiti 用户对象之间的关系。string 
userFirstNameAttribute匹配 first name 的属性名。 这个属性用来在查找用户对象时 关联 LDAP 对象与 Activiti 用户对象之间的关系。string 
userLastNameAttribute匹配 last name 的属性名。 这个属性用来在查找用户对象时 关联 LDAP 对象与 Activiti 用户对象之间的关系。string 
groupIdAttribute匹配组 id 的属性名。 这个属性用来在查找组对象时 关联 LDAP 对象与 Activiti 组对象之间的关系。string 
groupNameAttribute匹配组名的属性名。 这个属性用来在查找组对象时 关联 LDAP 对象与 Activiti 组对象之间的关系。String 
groupTypeAttribute匹配组名的属性类型。 这个属性用来在查找组对象时 关联 LDAP 对象与 Activiti 组对象之间的关系。String 

下列属性用在希望修改默认行为 或修改组缓存的情况:

Table 17.2.高级属性

属性名描述类型默认值
ldapUserManagerFactory设置 LDAPUserManagerFactory 的自定义实例,如果默认实现不满足需求。LDAPUserManagerFactory 的实例 
ldapGroupManagerFactory设置 LDAPGroupManagerFactory 的自定义实例,如果默认实现不满足需求。LDAPGroupManagerFactory 的实例 
ldapMemberShipManagerFactory设置 LDAPMembershipManagerFactory 的自定义实例,如果默认实现不满足需求。 注意它不常用,因为正常情况下 LDAP 会自己管理关联关系。LDAPMembershipManagerFactory 的实例 
ldapQueryBuilder设置自定义查询构造器,如果默认实现不满足需求。 LDAPQueryBuilder 实例用在 LDAPUserManager 和 LDAPGroupManager 中, 执行对 LDAP 的查询。 默认实现会使用配置的 queryGroupsForUser 和 queryUserById 属性。org.activiti.ldap.LDAPQueryBuilder 的实例 
groupCacheSize组缓存的大小。 这是一个 LRU 缓存,用来缓存用户的组, 可以避免每次查询用户的组时,都要访问 LDAP。 如果值小于 0,就不会创建缓存。 默认为-1,所以不会进行缓存。int-1
groupCacheExpirationTime设置组缓存的过期时间,单位为毫秒。 当获取特定用户的组时,并且组缓存也启用了, 组会保存到缓存中,并使用这个属性设置的时间。 例如,当组在 00:00 被获取,过期时间为 30 分钟, 那么所有在 00:30 之后进行的查询都不会使用缓存, 而是再次去 LDAP 查询。因此,所以在 00:00 - 00:30 进行的查询都会使用缓存。long1 小时

注意,在使用活动目录(AD)时:Activiti 论坛中的人们反映对于活动目录(AD), 'InitialDirContext'需要设置为 Context.REFERRAL。可以通过上面描述的 customConnectionParameters 传递。

为 Explorer 集成 LDAP

  • 把上面的 LDAP 配置添加到 activiti-standalone-context.xml 中。
  • 把 activiti-ldap jar 放到 WEB-INF/lib 目录下
  • 删除 demoDataGenerator bean,因为它会尝试插入数据(集成 LDAP 不允许这么做)
  • 将下面的配置添加到 activiti-ui.contextexplorerApp bean 中:
    <property name="adminGroups">
    <list>
    <value>admin</value>
    </list>
    </property>
    <property name="userGroups">
    <list>
    <value>user</value>
    </list>
    </property>

    请使用你自己的配置替换其中的值。需要用到的数据是组的 id(通过 groupIdAttribute 配置)。 上述配置会让'admin'组下的所有用户都成为 Activiti Explorer 的管理员,用户组也一样。 所有不匹配的组都会当做“分配”组, 这样任务就可以分配给他们。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文