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/openldap、osixia/phpldapadmin两个容器之后,通过Web管理端访问LDAP服务会特别“卡”,并且在新建LDAP实体的时候,经常导致osixia/openldap这个容器直接出错退出。
无奈之下,最后改用了ApacheDS。意外发现了一个特别好用的工具:Apache Directory Studio。这个软件真的是非常强大,它既是一个LDAP客户端可以用来连接不同类型的LDAP服务器,也可以直接在这个软件中搭建出一个LDAP服务器。这个软件是基于Eclipse开源开台上开发出来的,熟悉Eclipse界面的同学使用起来上手会非常快,墙烈推荐!根据你的平台,在官网下载,下载完成直接双击安装包一路下一步安装即可。
搭建LDAP服务器
选中LDAP Servers窗口,点击New Server
按钮,在弹出的界面中选中ApacheDS 2.0,然后填写一个LDAP服务器的名字:
右键选中新建好的服务器,点击Open Configuration
:
首先修改服务器监听的端口为389和636,这2个端口是LDAP服务的熟知端口,建议这样改:
新建一个服务器之后,会有2个默认的Partitions,注意第二个Partition,也就是system(ou=system),它的前面有一个黄色小锁头标志,这个是用来管理的域,是无法删掉的。现在我们把第一个Partion删除,也就是example(dc=example,dc=com),这个是自带的一个示例,可以不要它:
点击Add
,填写ID和Suffix(最好是你自己的或你公司的域名),使用Ctrl + s
保存:
右键选中新建的服务器,选中Run
,当服务器的状态由“Starting”变成“Started”之后,就表示服务器搭建成功了:
连接LDAP服务器
简单方式
开始我也提到了,Apache Directory Studio其实是一个LDAP Client,我们现在就要用它去连接上一步骤中我们建好的那个叫Localhost的LDAP服务器,有一个非常方便的方法连接,就是右键服务器,点击Create a Connection
,这样点一下就可以了,免去了填写IP、端口、密码等步骤:
手动方式
上面的那种方式方便是方便,但忽略掉了很多细节,不利于我们的学习,比如默认的管理员密码是多少?连接名字能不能叫别的?现在我们把上一步创建的连接删掉,找到Connections标签页,点击New Connection
来创建一个连接:
填写连接的名称、LDAP服务器的IP和端口:
填写管理员的用户名和密码,用户名是我们在搭建LDAP服务器时见到的那个默认的不能删的那个Partition,即:uid=admin,ou=system;密码是在官方文档中提到的secret:
在生产环境中,一定要将管理员密码修改成强口令,依次展开ou=system -> uid=admin,双击userPassword
这个属性:
这里可以勾选复选框Show current password details
来反显出密码,可以验证密码就是文档中提到的secret:
切换到New Password标签页,输入新的密码:
初始化LDAP
我们之前手动创建过一个Partition(dc=ningyu,dc=me),现在它还是空的,下面什么都没有,为了能对接Camunda,我们得在ApacheDS中创建出一些实体作为Camunda的组、创建出一些人作为Camunda的用户,并让Camunda正确读到组和用户的关系。
先按下面这样去配置,为什么要这么配置呆会再细说,右键选中dc,然后点击New
,New Entry
,Create entry from strach
:
在弹出来的窗口中,过滤出organizationUnit
,然后点击Add:
在RDN中选择ou,然后值设置为一个组织的名字,这个随便填一个也可以(这步其实可以忽略的,但是为了更有层次,组织机构能更好看,建议先建一个ou):
右键选中这个ou,依次点击New
,New Entry
,Create entry from strach
:
在弹出来的窗口中,过滤出groupOfNames
,然后点击Add
:
在RDN中选择cn,然后值设置为一个通用名作为组名字,这个就是将来会出现在Camunda Admin中的组,这里先将member留空,一会儿创建完了用户之后,再回来补充这个member的属性:
右键选中这个cn,依次点击New
,New Entry
,Create entry from strach
:
在弹出来的窗口中,过滤出inetOrgPerson
,然后点击Add
:
在RDN中选择cn,然后值设置为一个通用名,填写一个用户名字:
点击New Attribute
,依次过滤出并添加uid, mail, mobile, givenName, userPassword这几个属性:
同理再添加一个ops组,和一个叫旋涡鸣人的用户:
现在返回,将用户添加到组中,我就只拿一个用户为例,选中cn=dev这个实体,双击member
这个属性,在弹出的窗口中浏览并选中要拉到这个组中用户,点击OK
:
同理,把另外一个用户也拉到组里去:
LDAP中最终的效果如下,在组织worksheet下,有两个组dev和ops,每个组中各有一个用户:
Camunda配置
找到Camunda bpm的服务器的软件分发包,按下面这样修改camunda-bpm-tomcat-7.14.0\server\apache-tomcat-9.0.36\conf目录中的bpm-platform.xml文件:
1 | <!-- LDAP CONFIGURATION --> |
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),这样就可以把我们添加的用户查询出来:
userIdAttribute:这个属性指定了Camunda要用LDAP对象中的哪个属性作为用户ID,Camunda在定义流程时用到的用户就是这个,也就是在Camunda Modler中任务处理人(assignee)的那个字段,推荐用的是uid:
userFirstnameAttribute:Camunda保存用户信息的时候,会分成二个字段,firstName和lastName,这个属性就是指定了Camunda要取用LDAP中的哪个属性作为firstName,我这里用的是sn属性:
userLastnameAttribute:Camunda保存用户信息的时候,会分成二个字段,firstName和lastName,这个属性就是指定了Camunda要取用LDAP中的哪个属性作为lastName,我这里用的是givenName属性:
userEmailAttribute:Camunda保存用户信息的时候还需要一个电子邮箱地址,这个属性就是指定了Camunda要取用LDAP中的哪个属性作为邮箱地址:
- userPasswordAttribute:配置了Camunda要用LDAP的userPassword属性作为密码,这个只能用userPassword这个属性。
- groupSearchBase:指定从哪个目录开始查找用户,如果这个配置的内容留空,就是在baseDn配置的那个目录找。
groupSearchFilter:当我们创建一个组时,会自动的添加2个叫做objectClass的属性,即,groupOfNames, top。这个groupSearchFilter属性设置为(objectclass=groupOfNames)时,这样就可以把我们添加的组查询出来:
- 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 | <plugin> |
如果不是用administratorUserName和administratorGroupName指定的用户,无法登陆到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登陆失败:
使用ningyu/123456登陆成功,右上角显示的“凝 域”,就是LDAP中的sn和givenName属性的组合:
切换到Camunda Admin的组管理中,可以看到我们在LDAP中创建好的2个groupOfNames作为了Camunda的2个组:
dev组下有一个用户ningyu:
ops组下有一个用户naruto:
遗留问题
- 如何设置组的类型?
- 如何设置用户和组归属于哪个租户?
- 如何为用户分配权限?
- 在为LDAP的inerOrgPerson使用email属性的时候提示不支持?
参考
- Welcome to ApacheDS — Apache Directory
- Integrating OpenLDAP With Camunda in Windows - DZone Java
- User Guide | camunda BPM docs
- LDAP概念和原理介绍 - WilburXu - 博客园