级别: 初级 李志 (goodlz@21cn.com), 软件部工程师, IBM
2004 年 3 月 01 日 本文就以 IBM Directory Server V5.1 这种 LDAP Server 为例,介绍如何在开发和运行环境中使用 LDAP 方式为 WebSphere 流程策划器提供人员支持服务。
引言
WebSphere 流程策划(WebSphere Process Choreographer,以下简称WPC)是 WebSphere Application Server Enterprise v5.0 以上版本所提供的工作流开发和运行环境。它支持各种同步和异步的流程控制。在异步流程中,往往涉及到人员参与的活动,如文档审批、工作监督和记录审核等。WPC为这些人员活动提供了可定制的Web方式管理页面。为验证参与活动的人员权限,WPC使用插件形式提供了三种人员支持服务(Staff Support Service):User Registry、LDAP 和 System 方式,如下图所示:
图1 人员支持服务体系
缺省的配置是使用 User Registry 插件方式下的 Local OS User Registry,它使用本地操作系统上的认证机制。然而,该配置无法提供 LDAP 插件方式的丰富功能,只适宜在开发过程中作为调试使用。LDAP 插件方式则被推荐用于生产环境下的认证解决方案。本文就以 IBM Directory Server V5.1 这种 LDAP Server 为例,介绍如何在开发和运行环境中使用 LDAP 方式为 WPC 提供人员支持服务。
1. LDAP 插件提供的认证方法
通过访问存储在 LDAP 服务器目录中的组织信息,LDAP 插件为 WPC 提供认证服务。它使用 JNDI 来访问 LDAP 服务器。您可以配置多个 LDAP 插件,用于访问不同的 LDAP 目录服务器。
使用LDAP插件,您可以通过各种途径来指定参与活动的人员。在 WPC 的开发环境 WebSphere Studio Application Developer Integrated Edition (WSADIE)中,可以右击一个人员活动,选择"特性",在弹出的窗口中点击"人员"选项卡,选择不同的查询描述来指定认证方法,如下图所示:
图2 选择查询描述
如果使用LDAP方式,有以下认证方法可供选择:
- Users: 指定具体的用户名。在 LDAP 方式下,输入用户的 DN 全称,如"cn=lizhi,ou=swg,o=ibm"。用户对象的类型缺省为"inetOrgPerson",可以根据需要修改配置文件,设置其他的对象类型来匹配您的应用。
- Users by user ID: 根据 UID 属性查找某个用户。也支持上下文变量**,如"%wf:process.starter%"。
- Group Members:查找某个组的所有用户,即该组的用户都可以参与活动。在 LDAP 方式下,输入组的DN 全称,如"cn=sec,ou=swg,o=ibm",组的缺省对象类型为"GroupOfNames"。
- Department Members:查找某个部门的所有用户,即该部门的用户都可以参与活动。在 LDAP 方式下,输入部门的 DN 全称。部门的缺省对象类型为"Department"。
- Role Members:查找某个角色的所有用户,即该角色的用户都可以参与活动。在 LDAP 方式下,输入角色的 DN 全称。组的缺省对象类型为"Role"。在下文中,我们将会使用实例介绍如何查找一个定制的角色。
- Manager of Employee:查找某个用户的经理,指定由该经理参与活动。该功能在审批流程中较为实用。比如流程中有相关的两个审批活动,第一个活动由某位员工填入待批信息,第二个活动的所有者指定为他的经理,由该经理进行批复。如果员工的岗位变动,只需修改 LDAP 目录中的相关信息即可,无需重新部署流程。
- Manager of Employee by user ID:根据 UID 属性查找某员工的经理,指定由该经理参与活动。请注意,这里输入的是员工的UID,而不是其经理的UID。支持上下文变量*。
- Person Search:通过属性查找某个用户,包括 Email 地址、电话号码、秘书名称等。
- Group Search:通过属性查找某个组,该组的用户都可以参与活动。
- Native Query:根据模板定义本地查询。
- Everybody:任何通过WebSphere Application Server认证的用户都可参与活动,多用于测试。
- Nobody:拒绝普通用户参与活动,只有流程管理员和 WPC 系统管理员才可以访问。
**上下文变量(Context Variables):通过变量的方式替代参数。比如已经指定了流程的管理员,就可以用 %wf:process.administrators% 的变量形式来指代该管理员。它的好处在于,可以将流程中不同地方指定的参数关联起来,从而将参与活动的人员形成某种联系。比如在一个审批流程中,有三个活动,第一个活动由某个工作组或科室的任一位员工填入待批信息,第二个活动由经理进行批复,第三个活动是由原来填写待批信息的那位员工浏览批复意见。在第一个活动中,由于多个员工都有权填写,因此他们都是潜在所有者(potential owner)。如何指定第三个活动是由真正填写信息的那位员工浏览呢?我们可以使用 Users by user ID 认证方法,并指定参数为上下文变量 %wf:activity(staff_1).owner%,其中 staff_1 为第一个活动的名称。这样,第一个活动的真正填写者,也就是所有者(owner),自动成为了第三个活动的潜在所有者。即使多位员工分别填写了待批信息,他们也只能浏览自己的那份审批意见,而不会弄混。
这些查找方法的定义存储在 $WSADIE_HOME\runtimes\ee_v5\ProcessChoreographer\Staff 目录下的 VerbSet.xml 和 LDAPTransformation.xsl 文件中,如果您熟悉 WPC 的 verb set 语法,还可以添加和定制自己的查找方法。
接下来,我们将以实例演示如何配置一个有人员参与的工作流,其中用到了 Role Members 和 Manager of Employee by user ID 这两种比较复杂的认证方法。这个实验的重点在于,根据自己应用的需要配置 LDAP 转换文件,从而获得比较灵活的查询结果。当组织结构发生变动时,尽量通过改变 LDAP 服务器的目录信息来适应变化,而避免改动和重新部署工作流。
我们设计的工作流模型中关于人员活动的部分如下图所示:
图3 流程模型
这是一个业务上报的工作流。staff_1 和 staff_2 分别为两个人员活动。其中 staff_1 的作用是由各科室的业务员填写工单,staff_2是由填写工单业务员的直属经理进行审批。需要解决的问题有:
1) 业务员分属不同的科室,如何在人员属性中使用参数指定这些潜在所有者?
2) 不同业务员分属不同的经理,如何避免经理看见自己下属以外其他人的工单?
解决方案:
1) 通常我们使用组,也就是 GroupOfNames 这种结构对象类来定义组织中的员工集合,往往是根据组织的行政划分来归类的,如"供销科"、"采购科"等。而业务员这种工作职责通常并不依赖于行政划分,而是一种工作划分。对于这种情况,我们可以采用角色来定义一组具有相同工作职责的人员。在 IBM Directory Server 中,角色的结构对象类是 accessRole。在本例中指定 staff_1 的人员属性如下图所示:
图4 staff_1 的人员属性
2)使用上下文变量是解决活动关联性的好方法。业务员都是 staff_1 活动的潜在所有者,也就是有权填写工单。要避免经理看见自己下属以外其他人的工单,关键是找到 staff_1 活动的所有者,指定 staff_2 的人员为该所有者的经理。我们可以在 staff_2 的人员属性中使用 Manager of Employee by user ID 认证方法,并指定参数为上下文变量 %wf:activity(staff_1).owner%。在 staff_2 活动中指定人员属性如下图所示:
图5 staff_2 的人员属性
定义好流程,接下来我们要配置 LDAP 服务器,将人员的认证信息放入目录中。
2. 配置 LDAP 服务器并建立组织结构
安装 IBM Directory Server V5.1,并进行以下配置。
1)单击"开始"按钮,选择"程序"/"IBM Directory Server"/"目录配置"。
2)在"IBM Directory Server 配置工具"窗口中,选择任务"管理员DN/密码",输入DN和密码,并点击"确定"按钮。
图6 管理员DN/密码
3)选择任务"配置数据库",并选择"创建新的数据库"单选框,点击"下一步"按钮,根据向导创建目录数据库。
4)选择任务"管理后缀",在"后缀DN"中输入机构的根结点DN,在这里,我们输入"o=ibm",点击"添加"按钮,再点击确定按钮,如下图所示。
图7 管理后缀
5)单击"开始"按钮,选择"程序"/"附件"/"命令提示符",切换到目录$IBM_Directory_Server_Home\appsrv\bin,输入startServer server1命令。(确保端口9080没有被占用)
6)打开网络浏览器,输入 IBM Directory Server Web管理页面的地址:http://localhost:9080/IDSWebApp/IDSjsp/Login.jsp,输入用户名:superadmin,密码:secret,并点击"登录"按钮。
图8 登录页面
7)在新的页面中,展开左边的"控制台管理"树,并点击"管理控制台服务器"。点击页面右边的"添加..."按钮,在"添加服务器"页面中输入主机名"localhost",并点击"确定"按钮,如下图所示。
图9 添加服务器
8)点击页面左边导航栏的"注销"按钮,重新登录。
9)在登录页面中,选择LDAP主机名为"localhost",输入我们刚才在 IBM Directory Server 配置工具中输入的管理员DN和密码,进入管理工具页面。如下图所示。
图10 管理工具页面
10)打开一个命令控制符窗口,输入"ibmslapd",启动 IBM Directory Server服务器。
11)在管理工具页面中,展开左边的"目录管理"树,点击"添加条目",在右边出现的"添加条目"页面中选择"organization"结构对象类。在"选择辅助对象类"页面中,选择"下一步",在"输入属性"页面中,输入相对DN:"o=ibm",在"必需属性"栏的"o"文本框中输入"ibm",点击"完成"按钮。
12)点击页面左边"目录管理"树中的"管理条目"节点,可以在右边的"管理条目"页面中看到出现了"o=ibm"的根结点,这表示我们建好了公司人员目录树的起始位置,如下图所示。
图11 管理条目页面
13)选择"o=ibm"节点前面的单选框,点击"添加"按钮,在右边出现的"添加条目"页面中选择"organizationUnit"结构对象类。在"选择辅助对象类"页面中,选择"下一步",在"输入属性"页面中,可以看到"父DN"栏中自动添加了"o=ibm",这表示我们添加的节点将在根节点之下。在相对DN中输入"ou=igs",在必需属性栏的 ou 框中输入"igs",点击"完成"按钮。展开"o=ibm",可看到"ou=igs"节点,用于表示公司中的部门。
14)选择"ou=igs"节点前面的单选框,点击"添加"按钮,在右边出现的"添加条目"页面中选择"inetOrgPerson"结构对象类,选择"下一步",在"选择辅助对象类"页面中选择"ePerson"辅助对象类,点击"添加"按钮,将结构类加入右边的"所选"框中,再选择"下一步",在相对 DN 中输入"cn=tom",在必需属性 cn 中输入"tom",sn 中输入"Johns"。点击"其他属性",在属性 uid 中输入 "tom",在 userPassword 中输入"tom1",点击"完成"按钮。展开"ou=igs"按钮,可以看到我们创建的员工节点"cn=tom"。
15)选择"cn=tom"节点前面的单选框,点击"复制..."按钮,在必需属性栏的 cn 中输入"jenry",sn 中输入"King",点击"其他属性",在属性 uid 中输入 "jenry",在 userPassword 中输入"jenry1"。点击 manager 旁的"多个值"按钮,输入"cn=tom,ou=igs,o=ibm",点击"添加",再点击"确定"按钮。在"输入属性 "页面中点击"完成"按钮。这样,另一个员工jenry就根据前一个人的模板创建出来了,而且指定tom作为他的经理。
16)同样,我们根据已有的模板创建员工 mary 和 rick,他们的 DN 全称分别为"cn=mary,ou=igs,o=ibm"和"cn=rick,ou=igs,o=ibm",并指定 rick 为 marry 的经理。
17)在管理工具页面中,展开左边的"目录管理"树,转至"ou=igs"所在的层,点击"添加"按钮,在右边出现的"添加条目"页面中选择"GroupOfNames"结构对象类,选择"下一步",在"选择辅助对象类"页面中再选择"下一步",在相对 DN 中输入"cn=supplement",在必需属性 cn 中输入"supplement"。点击 member 栏下的"多个值"按钮,依次输入"cn=tom,ou=igs,o=ibm"、"cn=jenry,ou=igs,o=ibm"并点击"添加"按钮,将这两个员工加入供销科。点击"确定"按钮,创建新组"cn=supplement,ou=igs,o=ibm"。
18)重复上一步骤,建立名为"cn=stock,ou=igs,o=ibm"的组,并把员工mary和rick加入该组。
19)接下来的工作是定义业务员的工作角色,并把 jenry 和 mary 加为业务员。 在管理工具页面中,展开左边的"目录管理"树,转至"ou=igs"所在的层,点击"添加"按钮,在右边出现的"添加条目"页面中选择"accessRole"结构对象类,选择"下一步",在"选择辅助对象类"页面中再选择"下一步",在相对 DN 中输入"cn=operator",在必需属性 cn 中输入"operator"。点击"其他属性",再点击 member 栏下的"多个值"按钮,依次输入"cn=jenry,ou=igs,o=ibm"、"cn=mary,ou=igs,o=ibm"并点击"添加"按钮,将两个员工加入该角色。点击"确定"按钮,再点击"完成"按钮创建角色。在管理条目页面中选择"cn=operator"节点并点击"编辑属性"按钮,可以在"成员"栏中看到两个员工已经加进来了,如下图所示。
图12 角色中的成员
至此,作为示例的LDAP目录树已经建立起来。它包括公司根节点"o=ibm",部门"ou=igs,o=ibm",供销科"cn=supplement,ou=igs,o=ibm"和其下的两个员工 "cn=tom,ou=igs,o=ibm"、"cn=jenry,ou=igs,o=ibm",采购科"cn=stock,ou=igs,o=ibm"和其下的两个员工"cn=rick,ou=igs,o=ibm"、"cn=mary,ou=igs,o=ibm"。其中 tom 和 rick 是科室经理,而 jenry 和 mary 是业务员。这个模型已经满足实验的需要,在实际的设计中,要根据实际情况划分更合理的层次,您可以参考 LDAP 目录设计的相关资料。
图13 目录结构
3. 小技巧
管理后缀
LDAP 目录中的根节点(如上文中的节点"o=ibm")需要在服务器中添加同名后缀后才能被创建。添加后缀有两种方法:使用"目录配置"工具,在"管理后缀"中添加;或者使用 IBM Directory Server Web 管理页面,展开左边导航栏的"服务器管理"栏,点击"管理服务器属性",在右边出现的页面中选择"后缀"项,在"后缀DN"框中输入后缀名,最后点击"添加"按钮即可。要注意,后缀同节点一样都是名值对,因此要确保后缀名和将要创建的根节点名称完全一致。
辅助对象类
LDAP对象类可以是下列三种类型之一:
- 结构: 每个条目都必须属于且只能属于一个结构对象类,这就定义了条目的基本内容。此对象类表示一个实际的对象。由于所有条目都必须属于结构对象类,所以这是最常用的对象类类型。
- 抽象: 此类型用作其它(结构)对象类的超类或模板。它定义一组结构对象类共有的一组属性。这些对象类(如果定义为抽象类的子类的话)继承已定义属性。不需要对每个下级对象类定义这些属性。
- 辅助: 此类型指示可与属于特定结构对象类的条目相关联的附加属性。虽然一个条目只能属于一个结构对象类,但它可以属于多个辅助对象类。
因此,结构对象类定义了节点的主要类型,而辅助对象类主要对节点的属性进行扩充。在定义人员时,我们除了使用结构对象类 inetOrgPerson 外,还添加了辅助对象类ePerson,这是因为 WebSphere 应用服务器缺省使用对象类 ePerson 对人员节点进行搜索。如不希望添加辅助对象类ePerson,可以修改$WAS_HOME\config\cell\本机节点名 目录下的 security.xml 文件,将"ePerson"字符串改成"inetOrgPerson"。
4. 总结
本文主要介绍了如何在工作流开发工具中指定参与人员,以及设计和配置 LDAP 目录以提供人员认证。您不但可以了解流程策划的人员支持服务体系,还可以熟悉 LDAP Server 的主要配置工作。接下来,
第二部分会介绍如何设置 WebSphere 企业版运行环境并运行工作流,从而验证我们的人员服务。
这里有一些资源,可以加深您对 WPC 的了解:
参考资料
1.这里是附带的定制后的LDAP转换文件(
LDAPTransformation.xsl文件)
2.
为带有内嵌JMS 的补偿工作流安装和配置 WebSphere Application Server Enterprise Process Choreographer BPE 容器
3.
WebSphere InfoCenter
4.
Redbook:WebSphere Application Server Enterprise V5 and Programming Model Extensions WebSphere Handbook Series
5.
Redbook:Exploring WebSphere Studio Application Developer Integration Edition 5.0
6.
相关文章
关于作者
对本文的评价
|