尉霁 施, IBM中国软件开发中心上海全球化实验室, IBM
2005 年 11 月 07 日 WebSphere Member Manager 是 WebSphere Portal Server 提供的一个组件,它负责管理 WebSphere Portal Server 的用户成员信息。不论用户成员信息是储存在 LDAP 或者是数据库中,WMM 提供了一种公共的访问机制来处理成员相关的信息。采用 WMM,用户可以为每个成员定义属性,或者添加、删除和修改成员的信息。用户还可以为成员分配用户组。采用 WMM API,用户可以轻松实现对 Portal 成员的管理。
介绍
WebSphere Portal Server 提供了多种用户认证管理机制。用户信息可以采用 LDAP 进行管理,也可以采用数据库进行管理。要在不同的用户信息管理机制之上实现用户管理,需要对不同的用户管理机制有比较全面的了解。
WebSphere Portal Server 自带的 WebSphere Member Manager 为用户提供了一个较好的解决这个问题的途径。WMM 可以根据用户配置的不同,采用不同的机制访问底层成员信息,而为应用程序提供统一的程序接口。当成员信息的存储方式发生变化时,只需要修改相应的配置文件就可以实现成员信息的移植,而不需要修改程序源文件。这就大大简化了 Portal 上实现用户管理的工作,当应用中需要定制自己的成员管理时,采用 WMM 将会为应用的开发维护节约大量时间。
WMM 提供了大量的成员操作方法。通过调用 WMM 编程接口,可以实现几乎全部的成员管理任务。WMM 提供的成员管理操作主要包括:
1 . 成员档案管理。包括添加成员、编辑和删除成员档案、修改成员层次结构、成员档案查询等等。
2 . 成员属性管理。包括系统中各类成员的属性的创建、修改和删除。
3 . 成员组管理。包括向组添加成员、删除组成员、组成员列表等等。
在本文中,将对如下内容进行讨论:
1 . 如何根据使用 LDAP 和数据库的不同对 WMM 进行配置;
2 . 如何把用户界面输入映射到 WMM 中的成员属性;
3 . WMM API 介绍,以及一些示例。
配置 WMM
在 WebSphere Portal Server 上,WMM 可以使用数据库或者 LDAP 作为成员管理机制。对于这 2 种不同的机制,需要进行不同的配置。
1. 配置 WMM 使用数据库
要配置 WMM 使用数据库,首先要在 WAS(WebSphere Application Server)中建立正确的 JDBC 提供程序和数据源。
1 . 启动 WAS,登录到 WAS 的控制台,选择资源 ->JDBC 提供程序。
2 . 如果已经有 JDBC 提供程序可用,那么可以不用新建 JDBC 提供程序,直接执行第 5 步。否则就需要新建一个 JDBC 提供程序。点击新建按钮。
3 . 选择一个 JDBC 提供程序类型,并点击确定。对于不同类型的数据库,需要选择不同的 JDBC 提供程序类型,例如对于 DB2 数据库,应该选择 DB2 Legacy CLI-based Type 2 JDBC Driver。
4 . 在提供程序配置面板中,你需要指定 JDBC 提供程序的类路径。例如,对于 DB2 数据库,类路径可以按照图一所示。设置完类路径以后点击确定。
图一 类路径示例
5 . 当建立完 JDBC 提供程序以后,就可以为它配置数据源了。点击该提供程序的其他属性里的数据源一项。
6 . 在数据源面板里,点击新建。名称一栏填写 wmmDS,JNDI 名填写 jdbc/wmmDS。然后点击应用。
7 . 如果你的数据库需要认证(采用 Cloudscape 数据库是不需要认证的),那么就需要建立一个 J2C 认证数据条目。在相关项中点击 J2C 认证数据条目。
8 . 点击新建,建立一个新的数据库别名。在新建面板里,填写需要的别名,其中用户标识和密码是数据库用户名和密码。
图二 数据库别名示例
9 . 点击确定,返回 wmmDS 配置面板,在容器受管的认证别名中选择你新建的数据库别名。然后点击应用。
10 . 对于不同的数据库,用户需要添加不同的自定义属性。在 wmmDS 面板中,点击其他属性中的定制属性。对于 DB2 数据库,需要将 databaseName 属性值设置为 wmm。
11 . 保存所有设置。然后进入数据源面板,选择 wmmDS 并点击测试连接。如果连接测试成功,那么就可以进入下一步配置 XML 文件了。
一般情况下,Portal Server 安装完成以后,WMM 的配置文件会被放置在 <WP_ROOT>/wmm 目录下。其中 wmm.xml 文件是 WMM 的主要配置文件,记录了大部分 WMM 系统配置。如果采用数据库作为 WMM 的成员管理机制,可以参照模板文件 wmm_DB.xml 对 wmm.xml 进行修改。
打开 wmm.xml 文件,可以看到 WMM 的所有配置都在元素 wmm 下。采用数据库作为 WMM 成员管理机制时,需要在 <repositories> 元素下面配置唯一的一个 databaseRepository 元素。这个 databaseRepository 元素中指定了使用的数据源、数据库类型等等。用户可以根据模板文件,结合数据库设置的实际情况,对 databaseRepository 中的属性进行修改。当 wmm.xml 正确配置以后,需要将 WMM 配置的一些信息更新到系统环境变量中。
进入 WAS 控制台,选择服务器 -> 应用程序服务器,选择安装了 WMM 的服务器,例如 WebSphere_Portal。在其他属性里选择进程定义;然后在其他属性里选择 Java 虚拟机;在其他属性里选择定制属性,新建一个属性,名称为 com.ibm.websphere.wmm.configfile,值为 wmm.xml。返回 Java 虚拟机设置面板,在类路径中添加上 WMM 的安装路径。保存所有设置并重新启动服务器。
到这里,配置 WMM 使用数据库全部完成,此时 Portal 上的用户信息,就是在数据库中进行存贮的。
2. 配置 WMM 使用 LDAP
如果使用 LDAP 作为 WMM 的成员管理机制,那么就不需要配置数据源了。用户可以参照模板文件 wmm_LDAP.xml 来对 wmm.xml 文件进行修改,配置 WMM 使用 LDAP。
采用 LDAP 作为 WMM 成员管理机制时,需要在 <repositories> 元素下面配置唯一的一个 ldapRepository 元素。在 ldapRepository 元素当中,需要指定 LDAP 服务器的主机名,端口,用户名,密码等等信息。另外,还需要将 LDAP 服务器上配置的节点名称与 WMM 上的节点名称做一个映射。请根据 LDAP 中节点的配置信息,参照模板文件,更新元素 ldapRepository 的属性和元素 nodeMaps 中的内容。
更新完 wmm.xml 文件以后,和配置 WMM 使用数据库一样,需要更新系统环境变量。请参考配置 WMM 使用数据库中的步骤,配置 configfile 变量和类路径。
到这里,配置 WMM 使用 LDAP 完成,Portal 上的用户信息将被放置到用户定义的 LDAP 服务器上。
定制 Portal 用户注册
WebSphere Portal Server 的用户管理机制是基于 WMM 实现的,当一个新用户向 Portal 提交用户注册信息的时候,Portal 会通过 WMM 的配置信息,将用户的输入数据和用户管理机制中的数据结构进行对应,将用户信息储存到数据库或者 LDAP 中。我们可以通过修改 WMM 配置文件的方式,实现对 Portal 用户注册的定制。
WebSphere Portal Server 提供了两种方式实现用户注册:Portlet 方式和 Screen 方式。不管采用哪一种方式,Portal 服务器均采用一个 JSP 文件作为用户注册或者编辑用户信息时用户属性的输入文件。当用户采用 Portlet 方式实现用户注册时,该 JSP 位于 Portal 服务器的已安装应用目录下面的 Selfcare 应用程序中。JSP 文件的名字是 UserInformationFormInclude.jsp。当用户采用 Screen 方式实现用户注册时,该 JSP 位于 <WAS_ROOT>/installedApps/<cell>/wps.ear/wps.war/screens/<markup>/UserProfileForm.jsp。当用户需要定制用户注册或者用户信息修改页面时,只需要修改对应的 JSP 文件就可以了。
用户信息 JSP 中包含一些默认的用户输入信息。当需要为一个用户信息添加新的属性的时候,只需要在该 JSP 中添加一个文本输入框,并对系统做相应的配置就可以了。下面我们将通过一个例子来说明自定义用户注册信息的过程。
在我们的 Portal 服务器上,当用户注册时,我们希望用户填写"生日"信息。首先,我们需要修改 JSP 文件,添加如下代码:
<tr>
<td>*</td>
<td class="wpsEditText">
生日
</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td>
<input class="wpsEditField" type="text" id="wps.birthday" name="wps.birthday">
</td>
<td> </td>
</tr>
|
注意到在我们新添加的文本框中,使用了 wps.birthday 这样的名称。下面我们需要修改 WMM 的配置文件,使得属性 birthday 可以和数据库或者 LDAP 中的定义对应起来。该配置文件是一个 XML 文件,在 wmm.xml 文件中通过属性 configurationFile 来指定,通常这个文件位于 WMM 的安装目录下面。默认的文件名为 wmmAttributes.xml。编辑 wmmAttributes.xml,添加以下元素:
<attributeMap wmmAttributeName="birthday"
applicableMemberTypes="Person "
pluginAttributeName="birthday"
multiValued="false"
dataType="String"
valueLength="255" />
|
其中各个属性的说明见表格。
表一 attributeMap 元素属性说明
| wmmAttributeName | WMM 属性名。该属性值需要和数据框的名称 wps.birthday 中 . 以后的部分完全一样。WMM 会通过该属性来对应 JSP 中的输入参数。 | | applicableMemberTypes | 适用的成员类型。成员类型也是在 wmm.xml 中定义的,默认情况下为下面 4 个值之一:Person、Group、Organization、OrganizationUnit | | pluginAttributeName | 对应的 LDAP 属性。该属性需要事先由 LDAP 管理员在 LDAP 中建立。当使用数据库作为 WMM 管理机制时,该属性不需要添加。 | | multiValued | 是否可以有多个值。 | | dataType | 数据类型。可以是 String,DateTime 等等。 | | valueLength | 数据长度。 |
如果是采用 LDAP 作为 WMM 的成员管理机制,那么需要由系统管理员在 LDAP 中为用户成员添加好对应的属性,存放生日信息。该成员属性由 pluginAttributeName 指定。如果是采用数据库作为 WMM 的成员管理机制,那么就不需要指定 pluginAttributeName,系统将会自动在数据库中建立生日对应的数据库项,存储用户信息。
修改完 wmmAttributes.xml 文件以后,保存所有设置并重新启动服务器,在 Portal 用户注册界面就可以填写用户生日信息,并可以在编辑用户信息时修改它了。
WMM API 介绍
WMM 除了通过一系列配置文件让用户进行定制以外,还提供了丰富的编程接口,让用户可以建立自己的应用程序来管理 Portal 的用户信息。
通过 WMM 的 API 编程接口,可以实现几乎全部的用户管理工作。用户管理工作可以分为几类:
1 . 成员档案管理。这类管理任务主要包括了成员档案的创建、修改、删除,在树状组织结构上移动成员,成员档案的查找和获取等等。
2 . 档案属性管理。这类管理任务主要包括为某一类成员档案添加新的属性,成员档案属性获取等等。
3 . 组成员管理。这类管理任务主要包括将某一成员添加到一个用户组,或者从用户组删除成员,列举用户组的所有成员等等。
用户可以通过调用 WMM 的 API,创建自己的应用程序,实现上述所有功能。WMM 的 API 通过 JAR 包 wmm.jar 提供,其中包含了以下包:
com.ibm.websphere.wmm
这个包中包含了 MemberService 这个 WMM 的主要类,所有成员操作几乎都是通过 MemberService 这个接口实现的。
com.ibm.websphere.wmm.objects
这个包中包含了 WMM 的 EJB 的 home 和 remote 接口。
com.ibm.websphere.wmm.datatype
这个包中包含了 WMM API 中使用的数据类型定义。
com.ibm.websphere.wmm.exception
这个包中包含了 WMM API 里产生的异常定义。
com.ibm.websphere.wmm.adapter
这个包中包含了一个接口 MemberRepository,通过这个接口用户可以开发自己存贮适配器,使 WMM 能够使用 LDAP 或者数据库以外的机制,来管理成员信息。
com.ibm.websphere.wmm.adapter.datatype
这个包中包含了自定义适配器中需要使用的数据类型的接口。
WMM 通过 EJB 提供成员管理功能,因此当用户需要使用 WMM 的成员管理功能时,需要首先连接到服务器的 EJB 接口。下面的工具类 WMMConnectioManager 展示了如何连接到 WMM EJB。通过调用 WMMConnectionManager.connect(),返回一个连接对象,其余的应用程序就可以通过这个连接对象来使用 WMM 的功能。
package com.ibm.sgl.oged.wmm.connection;
import java.rmi.RemoteException;
import java.util.Hashtable;
import javax.ejb.CreateException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.ibm.websphere.wmm.MemberService;
import com.ibm.websphere.wmm.objects.MemberServiceHome;
public class WMMConnectionManager {
/**
* EJB name
*/
private static final String EJB_NAME = "ejb/MemberServiceHome";
/**
* URL
*/
private static final String providerURL = "corbaloc:iiop:localhost:2810";
/**
* Context
*/
private static Context _ctx = null;
/**
* Member service
*/
private static MemberServiceHome _msHome = null;
/**
*
* Constructor for WMMConnectionManager.
*
*/
private WMMConnectionManager () {
super();
}
/**
* Connect to WMM
*
* @return the MemberService object
* @throws NamingException
* @throws RemoteException
* @throws CreateException
*/
public static MemberService connect () throws NamingException,
RemoteException, CreateException {
if (null == _msHome) {
initializeEJBConnection();
}
return _msHome.create();
}
/**
* Initialize parameters
*
* @concurrency
* @throws NamingException
* @throws RemoteException
*/
private static synchronized void initializeEJBConnection ()
throws NamingException, RemoteException {
if (null == _msHome) {
System.setProperty("java.naming.provider.url", providerURL);
Hashtable properties = new Hashtable();
_ctx = new InitialContext(properties);
_msHome = (MemberServiceHome) _ctx.lookup(EJB_NAME);
}
}
}
|
由 connect 方法返回的 MemberService 接口,提供了对 WMM 成员操作的各种方法,例如可以调用 MemberService.createMember() 来创建新成员,调用 MemberService.updateMember() 来更新成员信息,调用 MemberService.removeMember() 来删除成员等等。下面的例子说明了如何利用 WMM API 添加一个新成员。
Member newMember = MemberFactory
.getInstance(Member.MEMBER_TYPE_PERSON); // 该成员是一个用户,// 而不是一个用户组
Attribute attr1 = AttributeFactory.getInstance("givenName");
attr1.addValue("personName");
newMember.addAttribute(attr1);
Attribute attr2 = AttributeFactory.getInstance("cn");
attr2.addValue("Person1");
newMember.addAttribute(attr2);
Attribute attr3 = AttributeFactory.getInstance("ibm-primaryEmail");
attr3.addValue("Person1@ibm.com");
newMember.addAttribute(attr3);
Attribute attr4 = AttributeFactory.getInstance("preferredLanguage");
attr4.addValue("cn");
newMember.addAttribute(attr4);
Attribute attr5 = AttributeFactory.getInstance("uid");
attr5.addValue("Person1");
newMember.addAttribute(attr5);
Attribute attr6 = AttributeFactory.getInstance("sn");
attr6.addValue("Person1");
newMember.addAttribute(attr6);
Attribute attr7 = AttributeFactory.getInstance("userPassword");
attr7.addValue("password");
newMember.addAttribute(attr7);
MemberService ms = WMMConnectionManager.connect();
MemberIdentifier mi = ms.createMember(newMember);
|
下面的例子说明了如何把上面建的用户 Person1 分配到用户组 Group1。
MemberIdentifier groupID = MemberIdentifierFactory.getInstance(
"cn=Group1,o=Default Organization", null);
ms.assignMemberToGroup(groupID, mi);
|
有关 WMM 其他用户管理功能的 API 接口,请参照 WMM API 的相关文档。
结论
WebSphere Member Manager 提供了一种统一的机制,实现了用户管理。不论底层的存储是采用 LDAP 还是数据库,用户都可以使用 WMM 的统一编程接口,实现自定义的 Portal 用户管理。用户可以编写自己的 Portal 应用程序,代替 Portal 服务器提供的用户注册、用户信息编辑等功能。
参考资料
关于作者  | |  | 作者施尉霁来自IBM中国软件开发中心上海全球化实验室。他的工作是研究开发IBM全球化的e-Business解决方案。 |
对本文的评价
|