WebSphere Application Server 6.0安全认证 之独立定制注册表

1.简介

WebSphere Application Server提供了非常成熟强大的J2EE安全认证机制。WebSphere Application Server启动安全模式,有3种用户注册表(安全认证的数据源):

1) 本地操作系统(Local OS)

2) 轻量级目录访问协议(LDAP)

3) 定制用户注册表(Custom User Registry)

其中方式一和方式二快速方便,无需建立专门的用户数据库。但是,更多时候,客户拥有独立的用户验证数据库存储用户安全信息。方式三使得WebSphere Application Server可以和任意类型数据源进行整合,比如数据库,文件系统,甚至是网络认证服务器。今天主要说一下独立用户注册表这种认证机制。

 

2.定制用户注册表概念

定制用户注册表是一个定制实现的用户注册表,它实现了WebSphere Application Server提供UserRegistry Java接口。一个定制用户注册表可以支持任意类型的用户数据源,包括关系型数据库,文件系统等等,因此,定制用户注册表在整合已有用户数据源方面非常适用。UserRegistry接口规定了是用来定义WebSphere Application Server对密码或是安全证书进行验证的一系列方法,一个定制用户注册表必须实现UserRegistry接口中的全部方法。

 

3.UserRegistry接口概述

UserRegistry接口包括的用户信息:

  • 用户安全名字(User Security Name):用于验证的用户名字,就如本地操作系统验证方式的用户名。
  • 用户唯一ID(User Unique ID):每个用户对应的唯一ID。
  • 用户显示名字(User Display Name):可选项,用于显示该用户的名字,比如在欢迎界面,相当于本地操作系统验证方式下的该用户的全名。
  • 组安全名字(Group Security Name):用于验证的组的名字,就如本地操作系统的用户。
  • 组唯一ID(Group Unique ID):每个组对应的唯一ID。
  • 组显示名字(Group Display ID):可选项,用于显示该组的名字,比如在欢迎界面,相当于本地操作系统验证方式下的该组的全名。

UserRegistry接口必须实现的方法:

  • initialize
  • checkPassword
  • mapCertificate
  • getRealm
  • getUsers
  • getUserDisplayName
  • getUniqueUserId
  • getUserSecurityName
  • isValidUser
  • getGroups
  • getGroupDisplayName
  • getUniqueGroupId
  • getUniqueGroupIds
  • getGroupSecurityName
  • isValidGroup
  • getGroupsForUser
  • getUsersForGroup
  • createCredential

4.实现UserRegistry接口

必须实现UserRegistry接口定义的所有方法(createCredential方法例外)。下面详细介绍与整合密切相关的两个方法initialize 和checkPassword,并给出DemoCustomRegistry中的实现代码。在实现代码之前需要去was控制台里面配置一些信息。

点击安全性->安全管理、应用程序和基础结构

WebSphere Application Server 6.0安全认证 之独立定制注册表

这里选择独立定制注册表,点击配置

WebSphere Application Server 6.0安全认证 之独立定制注册表

因为我们要实现自己的验证用户(我们自己的数据库)的机制,这里的用户名添业务库的用户名,类名就是我们自己实现UserRegistry的类,点击定制属性

 WebSphere Application Server 6.0安全认证 之独立定制注册表

新建

WebSphere Application Server 6.0安全认证 之独立定制注册表

这里加载了配置文件,里面的信息是连接数据库的url name password,一会需要从这里读取。点击确定之后在第一个页面点击设置为当前。

到此Was控制台配置完成,下面开始实现代码。

 

initialize方法

public void initialize(Properties props) throws CustomRegistryException,RemoteException {
        	try {
                  if (props != null) {
                      url = props.getProperty("url");
                      user = props.getProperty("user");
                      password = props.getProperty("password");
                  }
              } catch(Exception ex) {
                 throw new CustomRegistryException(ex.getMessage(),ex);
              }
              if (url == null || user == null || password == null ) {
                 throw new CustomRegistryException("users/groups information missing");
              }
              configOK = true;
    }
   }

 

getUsers方法

public Result getUsers(String pattern, int limit) throws CustomRegistryException, RemoteException {
		Result result = new Result();
		Connection conn = null;
		try {
			conn = getConnection();
			Statement stmt = conn.createStatement();
			stmt.setFetchSize(limit);
			pattern = pattern.replace('*','%');
			String sSQL = "SELECT " + COLUMN_USER_NAME + " FROM " + TABLENAME_USER + " WHERE " + COLUMN_USER_NAME + " LIKE '%" + pattern + "%'";
			printLog((new StringBuilder("In getting users:")).append(sSQL).toString());
			ResultSet rs = stmt.executeQuery(sSQL);
			int i=0;
			List allUsers = new ArrayList();
			while(rs.next() && ++i<=limit)  {
				allUsers.add(rs.getString(COLUMN_USER_NAME));
			}
			if(i == limit) {
				result.setHasMore();
			}
			result.setList(allUsers);
			stmt.close();
			rs.close();
		} catch(Exception ex) {
			throw new CustomRegistryException(ex.getMessage(), ex);
		} finally {
			if(conn != null) closeConnection(conn);
		}
		return result;
	}

 

这里要怎么写完全可以自己定,这个方法就是前面第二张图填入用户名点击确定要去数据库里找这个用户,如果找不到会报错。

 

checkPassword方法

checkPassword方法用于验证该用户名以及对应的密码是否合法。该函数是整合用户数据源的关键。

public String checkPassword(String userSecurityName, String password) throws PasswordCheckFailedException, CustomRegistryException, RemoteException {
return username;
			}

 

配置完这些,重启服务,就可以实现WAS跟业务库的结合。