|
1. 简介
WebSphere Application Server提供了非常成熟强大的J2EE安全认证机制。WebSphere Application Server启动安全模式,有3种用户注册表(安全认证的数据源):
1) 本地操作系统(Local OS)
2) 轻量级目录访问协议(LDAP)
3) 定制用户注册表(Custom User Registry)
其中方式一和方式二快速方便,无需建立专门的用户数据库。但是,更多时候,客户拥有独立的用户验证数据库存储用户安全信息。方式三使得WebSphere Application Server可以和任意类型数据源进行整合,比如数据库,文件系统,甚至是网络认证服务器。
WebSphere Application Server v6.0 on Redhat AS3.0
IBM DB2 Universal v8.1
Rational Software Architect 6.0
本文通过一个实例DemoCustomUserRegistry工程来阐述如何定制用户注册表将用户数据库与WebSphere Application Server安全认证整合,作为WebSphere Application Server后台验证数据。
定制用户注册表是一个定制实现的用户注册表,它实现了WebSphere Application Server提供UserRegistry Java接口。一个定制用户注册表可以支持任意类型的用户数据源,包括关系型数据库,文件系统等等,因此,定制用户注册表在整合已有用户数据源方面非常适用。UserRegistry接口规定了是用来定义WebSphere Application Server对密码或是安全证书进行验证的一系列方法,一个定制用户注册表必须实现UserRegistry接口中的全部方法。
UserRegistry接口包括的用户信息:
UserRegistry接口必须实现的方法:
必须实现UserRegistry接口定义的所有方法(createCredential方法例外)。下面详细介绍与整合密切相关的两个方法initialize 和checkPassword,并给出DemoCustomRegistry中的实现代码。
初始化方法,可在该函数里读取一些在WebSphere Application Server为该用户注册表所作一些属性配置。DemoCustomUserRegistry将从WebSphere Application Server配置中读取db2url,db2user,db2password属性。具体配置方法将在"配置定制用户注册表"部分详述。
public void initialize(Properties props) throws CustomRegistryException,RemoteException {
try {
if (props != null) {
DB2URL = props.getProperty("db2url");
DB2USER = props.getProperty("db2user");
DB2PASSWORD = props.getProperty("db2password");
}
} catch(Exception ex) {
throw new CustomRegistryException(ex.getMessage(),ex);
}
if (DB2URL == null || DB2USER == null || DB2PASSWORD == null ) {
throw new CustomRegistryException("users/groups information missing");
}
configOK = true;
}
}
checkPassword方法用于验证该用户名以及对应的密码是否合法。该函数是整合用户数据源的关键。DemoUserCustomRegistry从DB2数据库的EMPLOYEE表里查询对应的用户信息,如果验证成功,返回该用户名,验证失败,则抛出验证失败异常。
public String checkPassword(String userSecurityName, String passwd)
throws PasswordCheckFailedException, CustomRegistryException,
RemoteException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
boolean validUser = false;
try{
Class.forName(DB2DRIVER).newInstance();
conn = DriverManager.getConnection(DB2URL,DB2USER,DB2PASSWORD);
if(null != conn){
ps = conn.prepareStatement(AUTHSQL);
ps.setString(1,userSecurityName);
ps.setString(2,passwd);
rs = ps.executeQuery();
if(rs.next())
validUser = true;
}
}catch(Exception e){
System.out.println("Andrew: DB Exception!"+e.toString());//$NON-NLS-1$
}finally{
if(null != rs){
try {
rs.close();
} catch (SQLException e) {
}
}
if(null != ps){
try {
ps.close();
} catch (SQLException e){
}
}
if(null != conn){
try {
conn.close();
} catch (SQLException e) {
}
}
}
if (validUser == false) {
throw new PasswordCheckFailedException("Password check failed for user: "
+ userSecurityName);
}
return userSecurityName;
}
1) 新建Java工程 DemoCUR, 并在项目中新建package,取名为com.test,将本文例子代码中的DemoCustomUserRegistry.java导入项目工程,并在工程项目的"Java Build Path"中添加sas.jar 和 wssec.jar。
2) 拷贝com/test/DemoCustomUserRegistry.class的目录结构至WebSphere Application Server v6.0的扩展库路径下,一般为(/opt/IBM/WebSphere/lib/ext)。
3) 登陆WebSphere Application Server控制台。在浏览器中输入http://wasip:9060/admin。在左导航面板中,单击"Security",单击"Global Security"。
4) 选中"Enable global security"复选框,"Active User Registry"中选择"Custom User Registry"。
5) 单击"OK"。
6) 单击右导航栏中的"User Registry"下的"Custom"。
7) 在"Server user ID"中输入用于登陆控制台的帐号,在"Server user password"中输入该帐号对应的密码,在"Custom registry class name"中输入"com.test.DemoCustomUserRegistry"。
8) 点击"Apply"。
9) 点击"Additional Properties"下的"Custom properties"。
10) 点击"New"。在"Name"中输入"db2url",在"Value"中输入"jdbc:db2://dbip:50000/dbname",
11) 重复步骤10,分别建立变量"db2user","db2password",对应的值分别为用户数据库的db验证用户名和密码。
12) 点击"Custom User Registry"返回到定制用户注册表配置页面
13) 拷贝JDBC驱动程序(db2jcc.jar, db2jcc_license_cisuz.jar, db2jcc_license_cu.jar)至WebSphere Application Server v6.0的库路径下(如果已经存在则可省略这步)。
14) 点击"OK"
15) 保存配置。
16) 重新启动WebSphere Application Server 6.0。至此,WebSphere Application Server 6.0的安全认证已经采用用户数据库。