Camunda集成LDAP

背景

当安装好Camunda BPM之后,用默认用户名demo和默认密码demo可以登陆到Camunda Cockpit。在不修改任何配置的情况下,Camunda使用的是一个叫做H2的嵌入式数据库,Camunda的所有数据都保存在这个数据库中,当然也包括认证服务的数据。

在实际的环境中,我们可以替换这个H2数据库为MySQL或MariaDB。然而有一些公司是把用LDAP来保存组织机构信息,Camunda BPM自带了一些插件来支持使用LDAP作为认证服务。本文将演示如何从搭建LDAP服务器到配置Camunda对接LDAP的整个过程。最终实现可以用LDAP中的用户去登陆Camunda Cockpit。

LDAP是一个协议,有很多软件厂商提供产品实现,比如微软AD,OpenLDAP,ApacheDS等等。我的开发机装的是Windows系统,我折腾了好久用Docker来部署OpenLDAP,最后还是失败了,遇到的问题是:在成功启动了osixia/openldaposixia/phpldapadmin两个容器之后,通过Web管理端访问LDAP服务会特别“卡”,并且在新建LDAP实体的时候,经常导致osixia/openldap这个容器直接出错退出。

无奈之下,最后改用了ApacheDS。意外发现了一个特别好用的工具:Apache Directory Studio。这个软件真的是非常强大,它既是一个LDAP客户端可以用来连接不同类型的LDAP服务器,也可以直接在这个软件中搭建出一个LDAP服务器。这个软件是基于Eclipse开源开台上开发出来的,熟悉Eclipse界面的同学使用起来上手会非常快,墙烈推荐!根据你的平台,在官网下载,下载完成直接双击安装包一路下一步安装即可。

搭建LDAP服务器

选中LDAP Servers窗口,点击New Server按钮,在弹出的界面中选中ApacheDS 2.0,然后填写一个LDAP服务器的名字:

image-20210205103402628

右键选中新建好的服务器,点击Open Configuration

image-20210205104005029

首先修改服务器监听的端口为389和636,这2个端口是LDAP服务的熟知端口,建议这样改:

image-20210205104312002

新建一个服务器之后,会有2个默认的Partitions,注意第二个Partition,也就是system(ou=system),它的前面有一个黄色小锁头标志,这个是用来管理的域,是无法删掉的。现在我们把第一个Partion删除,也就是example(dc=example,dc=com),这个是自带的一个示例,可以不要它:

image-20210205104818080

image-20210205105311331

点击Add,填写ID和Suffix(最好是你自己的或你公司的域名),使用Ctrl + s保存:

image-20210205105439867

右键选中新建的服务器,选中Run,当服务器的状态由“Starting”变成“Started”之后,就表示服务器搭建成功了:

image-20210205105705720

image-20210205105907220

连接LDAP服务器

简单方式

开始我也提到了,Apache Directory Studio其实是一个LDAP Client,我们现在就要用它去连接上一步骤中我们建好的那个叫Localhost的LDAP服务器,有一个非常方便的方法连接,就是右键服务器,点击Create a Connection,这样点一下就可以了,免去了填写IP、端口、密码等步骤:

image-20210205110429267

image-20210205110534722

手动方式

上面的那种方式方便是方便,但忽略掉了很多细节,不利于我们的学习,比如默认的管理员密码是多少?连接名字能不能叫别的?现在我们把上一步创建的连接删掉,找到Connections标签页,点击New Connection来创建一个连接:

image-20210205111004477

填写连接的名称、LDAP服务器的IP和端口:

image-20210205111328269

填写管理员的用户名和密码,用户名是我们在搭建LDAP服务器时见到的那个默认的不能删的那个Partition,即:uid=admin,ou=system;密码是在官方文档中提到的secret

image-20210205111912405

image-20210205111947507

在生产环境中,一定要将管理员密码修改成强口令,依次展开ou=system -> uid=admin,双击userPassword这个属性:

image-20210205112230448

这里可以勾选复选框Show current password details来反显出密码,可以验证密码就是文档中提到的secret

image-20210205112456552

切换到New Password标签页,输入新的密码:

image-20210205154042955

初始化LDAP

我们之前手动创建过一个Partition(dc=ningyu,dc=me),现在它还是空的,下面什么都没有,为了能对接Camunda,我们得在ApacheDS中创建出一些实体作为Camunda的组、创建出一些人作为Camunda的用户,并让Camunda正确读到组和用户的关系。

先按下面这样去配置,为什么要这么配置呆会再细说,右键选中dc,然后点击NewNew EntryCreate entry from strach

image-20210205161157998

在弹出来的窗口中,过滤出organizationUnit,然后点击Add:

image-20210205164803323

image-20210205164817943

在RDN中选择ou,然后值设置为一个组织的名字,这个随便填一个也可以(这步其实可以忽略的,但是为了更有层次,组织机构能更好看,建议先建一个ou):

image-20210205165000843

image-20210205165054320

image-20210205165149902

右键选中这个ou,依次点击NewNew EntryCreate entry from strach

image-20210205165256107

在弹出来的窗口中,过滤出groupOfNames,然后点击Add

image-20210205165428223

image-20210205165604279

在RDN中选择cn,然后值设置为一个通用名作为组名字,这个就是将来会出现在Camunda Admin中的组,这里先将member留空,一会儿创建完了用户之后,再回来补充这个member的属性:

image-20210205165654714

右键选中这个cn,依次点击NewNew EntryCreate entry from strach

image-20210205170113415

在弹出来的窗口中,过滤出inetOrgPerson,然后点击Add

image-20210205170247949

在RDN中选择cn,然后值设置为一个通用名,填写一个用户名字:

image-20210205170431146

点击New Attribute,依次过滤出并添加uid, mail, mobile, givenName, userPassword这几个属性:

image-20210205171042852

image-20210205171749076

同理再添加一个ops组,和一个叫旋涡鸣人的用户:

image-20210205172312609

现在返回,将用户添加到组中,我就只拿一个用户为例,选中cn=dev这个实体,双击member这个属性,在弹出的窗口中浏览并选中要拉到这个组中用户,点击OK

image-20210205172802406

同理,把另外一个用户也拉到组里去:

image-20210205172928742

LDAP中最终的效果如下,在组织worksheet下,有两个组dev和ops,每个组中各有一个用户:

image-20210205173010964

Camunda配置

找到Camunda bpm的服务器的软件分发包,按下面这样修改camunda-bpm-tomcat-7.14.0\server\apache-tomcat-9.0.36\conf目录中的bpm-platform.xml文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!-- LDAP CONFIGURATION -->
<!-- Uncomment this section in order to enable LDAP support for this process engine -->
<!-- Adjust configuration, see ( http://docs.camunda.org/latest/guides/user-guide/#process-engine-identity-service-the-ldap-identity-service ) -->
<plugin>
<class>org.camunda.bpm.identity.impl.ldap.plugin.LdapIdentityProviderPlugin</class>
<properties>
<property name="serverUrl">ldap://localhost:389/</property>
<property name="acceptUntrustedCertificates">false</property>
<property name="managerDn">uid=admin,ou=system</property>
<property name="managerPassword">123456</property>

<property name="baseDn">ou=worksheet,dc=ningyu,dc=me</property>

<property name="userSearchBase"></property>
<property name="userSearchFilter">(objectclass=person)</property>

<property name="userIdAttribute">uid</property>
<property name="userFirstnameAttribute">sn</property>
<property name="userLastnameAttribute">givenName</property>
<property name="userEmailAttribute">mail</property>
<property name="userPasswordAttribute">userpassword</property>

<property name="groupSearchBase"></property>
<property name="groupSearchFilter">(objectclass=groupOfNames)</property>
<property name="groupIdAttribute">cn</property>
<property name="groupNameAttribute">cn</property>

<property name="groupMemberAttribute">member</property>
<property name="sortControlSupported">false</property>
</properties>
</plugin>


<!-- LDAP CONFIGURATION -->
<!-- The following plugin allows you to grant administrator authorizations to an existing LDAP user -->
<plugin>
<class>org.camunda.bpm.engine.impl.plugin.AdministratorAuthorizationPlugin</class>
<properties>
<property name="administratorUserName">ningyu</property>
</properties>
</plugin>

LDAP Identity Provider插件

  • serverUrl:这里填写你的LDAP服务器的地址,默认情况下,如果协议是ldap,端口就是389;如果协议是ldaps,端口就是636。
  • managerDn:管理员用户的用名户,即,ApacheDS服务器默认的那个无法删除的Partition中的uid=admin,ou=system。
  • managerPassword:管理员用户的密码,默认是secret,我们在安装步骤通过修改userPassword属性来改过这个密码。
  • baseDn:后续的用户和组都要从这个目录进行获取,例如ou=worksheet,dc=ningyu,dc=me,从这个目录中查找用户和组,可以缩小查询的范围。设置了这个属性之后,后面再设置userSearchBase和groupSearchBase的话都是要在这个baseDn属性指定的目录下去查找,如果不设置这2个属性就用baseDn的值。
  • userSearchFilter:当我们创建一个inetOrgPerson时,会自动的添加4个叫做objectClass的属性,即,inetOrgPerson, organizationalPerson, person, top。这个userSearchFilter属性设置为(objectclass=person),这样就可以把我们添加的用户查询出来:

    image-20210207095051833

  • userIdAttribute:这个属性指定了Camunda要用LDAP对象中的哪个属性作为用户ID,Camunda在定义流程时用到的用户就是这个,也就是在Camunda Modler中任务处理人(assignee)的那个字段,推荐用的是uid:

    image-20210207095606325

  • userFirstnameAttribute:Camunda保存用户信息的时候,会分成二个字段,firstName和lastName,这个属性就是指定了Camunda要取用LDAP中的哪个属性作为firstName,我这里用的是sn属性:

    image-20210207100814264

  • userLastnameAttribute:Camunda保存用户信息的时候,会分成二个字段,firstName和lastName,这个属性就是指定了Camunda要取用LDAP中的哪个属性作为lastName,我这里用的是givenName属性:

    image-20210207100905850

  • userEmailAttribute:Camunda保存用户信息的时候还需要一个电子邮箱地址,这个属性就是指定了Camunda要取用LDAP中的哪个属性作为邮箱地址:

    image-20210207101011034

  • userPasswordAttribute:配置了Camunda要用LDAP的userPassword属性作为密码,这个只能用userPassword这个属性。
  • groupSearchBase:指定从哪个目录开始查找用户,如果这个配置的内容留空,就是在baseDn配置的那个目录找。
  • groupSearchFilter:当我们创建一个组时,会自动的添加2个叫做objectClass的属性,即,groupOfNames, top。这个groupSearchFilter属性设置为(objectclass=groupOfNames)时,这样就可以把我们添加的组查询出来:

    image-20210207102333654

  • groupIdAttribute:指定用LDAP组对象的cn属性(也就是groupOfNames的cn属性)作为Camunda的组ID。这个cn值一般不需要改动。
  • groupNameAttribute:指定用LDAP组对象的cn属性作为Camunda的组名称。可以用groupOfNames的cn属性,也可以用name属性(比如组名称和组ID不想用同一个,例如组ID是英文,而组名称想用中文)。
  • groupMemberAttribute:指定从LDAP组对象的member属性,去获得Camunda组内有哪些用户。这个member值一般不需要改动。

Administrator Authorization插件

1
2
3
4
5
6
7
<plugin>
<class>org.camunda.bpm.engine.impl.plugin.AdministratorAuthorizationPlugin</class>
<properties>
<property name="administratorUserName">ningyu</property>
<property name="administratorGroupName">ops</property>
</properties>
</plugin>

如果不是用administratorUserNameadministratorGroupName指定的用户,无法登陆到Camunda Cockpit。

  • administratorUserName:这个属性指定了要用LDAP中的哪个用户作为Camunda的管理员,注意,这里只是配置了用户的uid,而不是uid=admin,ou=system。
  • administratorGroupName:这个属性指定了要用LDAP中的哪个组作为Camunda的管理员,注意,这里只是配置了组的cn,而不是cn=ops,ou=worksheet,dc=ningyu,dc=me。组中的所有成员都会被认定是Camunda管理员。

验证

使用demo/demo登陆失败:image-20210207105718528

使用ningyu/123456登陆成功,右上角显示的“凝 域”,就是LDAP中的sn和givenName属性的组合:

image-20210207105807523

切换到Camunda Admin的组管理中,可以看到我们在LDAP中创建好的2个groupOfNames作为了Camunda的2个组:

image-20210207110103235

dev组下有一个用户ningyu:

image-20210207110211007

ops组下有一个用户naruto:

image-20210207110245404

遗留问题

  • 如何设置组的类型?
  • 如何设置用户和组归属于哪个租户?
  • 如何为用户分配权限?
  • 在为LDAP的inerOrgPerson使用email属性的时候提示不支持?

参考

EOF