级别: 初级 尉霁 施, 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解决方案。 |
对本文的评价
|