隔叶黄莺 The Blog of Unmi

〖隔叶黄莺三四声,挂壁飞瀑千万尘。若是人间无净土,此处为何妙语真! 隔叶黄莺四字,本非取自此句,而有寄寓他意,因见妙语,亦与予心合!〗

BlogJava 首页 新随笔 联系 聚合 管理
  288 Posts :: 107 Stories :: 831 Comments :: 0 Trackbacks

通常 Websphere Application Server (WAS) 都是结合 LDAP 来对用户对行验证,实现单点登陆的。因为 LDAP 有着一个得天独厚的优势,它对查询进行了优化,因此 WAS 理所当然的提供了对 LDAP 十分完善的支持。从 WAS 控制台进 安全性->用户注册表->LDAP,在类型里可以看到支持 IBM_Directory_Server、SecureWay、Sun ONE、Domino、Active_Directory、eDirectory 还可定制 LDAP 连接。

好,就此打住,我在这里要介绍的是如何配置 WAS 控制台和应用通过 JDBC 来验证用户。这一想法产生的背景是:公司原所有系统是通过 Portal 做的集成,配置 LDAP 便能实现 SSO,但有一个新的项目暂不能通过 LDAP 来验证,但也要能实现 SSO,于是就意思到要用 JDBC 来进行用户验证。你也许已注意到在 安全性->用户注册表 下除了 本地 OSLDAP 外,还有一个 定制。我们就是要在这个 "定制" 上做文章的。下面详细具体步骤。

刚装好的 WAS 是没有启动安全性的,所以可以在 WAS 启动后,输入任意用户名进入到控制台。在 WAS 控制台中,我们进到 安全性->用户注册表->定制 页面,定制注册表类名 文本框中是 com.ibm.websphere.security.FileRegistrySample,以及说明中提到这个类要实现 com.ibm.websphere.security.UserRegistry 接口。在 eclipse 中用 Jar Search 目录指向到 WAS_HOME/lib 目录查找到 FileRegistrySample 类在 wssec.jar 包中,用工具反编译出这个类作为参考。同样找到接口类在 sas.jar 包中,可以看到这个接口类中有多少个方法要实现,在我们编译用户定制注册表类是要引入 WAS_HOME/sas.jar 包。

1. 编写 JdbcRegistry.java 类 (假定我们用 Oracle 数据库并用 Oracle 驱动包提供的连接池)

因为代码行太多,不在此列出,见附件 http://www.blogjava.net/Files/Unmi/was_security.rar 中的 JdbcRegistry.java 源文件。 

注意类 JdbcRegistry 中注释,每个方法中都加了一个 System.out.println() 语句,方便观察哪些方法会被何时执行。本篇的测试只看到前几个方法能得到执行。关于使用 Oracle 自带连接池实现可以参考之前的一篇日志:为何不直接使用 Oracle 提供的连接池实现。编译时需引入 WAS_HOME/lib/sas.jar 和 ORACLE_HOME/jdbc/lib/classes12.jar(或别的 Oracle 驱动包)。

2. 拷贝类 JdbcRegistry.class 文件

JdbcRegistry.java 编译后会在 com\unmi\websphere\security 目录下产生 JdbcRegistry.class 文件(命令行用 javac 编译须带上 -d 才能生成目录结构的)。把这个 com 目录整个拷贝到 WAS_HOME/classes 目录下,当然,你也可以把这个 com 目录打到一个包,如 JdbcSec.jar 中,然后把这个包放到 WAS_HOME/lib 目录下,不过要明白 WAS_HOME/classes 下的类文件要优先于 WAS_HOME/lib 下 jar 包中的类被加载。

3. WAS 控制台设置

① 为 JdbcRegistry 定制属性,安全性->用户注册表->定制 进到定制页面,点 定制属性 进入到属性定制页面。参考下图及你的实际输入正确的属性值。

定制完属性后,保存,控制台又会回到欢迎页面

② 配置用户注册表类,在 安全性->用户注册表->定制 页面,如下图

服务器用户标识 服务器用户密码 中输入数据库中存在的用户名和密码;定制注册表类名 中输入刚刚建立的类的全限名 com.unmi.websphere.security.JdbcRegistry忽略大小写 选项随意,因为代码中未作相应处理。

完成后点击 应用,会提示保存,请保存。如果点击的是 确定 按扭,则会定向到 全局安全性 页面,我们下面会讲到 全局安全性 设置。这里建议点 应用 按钮,感觉 WAS 的向导顺序有点乱。

如果前面输入的用户名和密码不匹配将不能完成保存。还有这里输入的用户和也可启用安全性后登陆 WAS 控制台的用户。

③ 配置 LTPA 及 SSO (这一步非必要的,别以为这里有 SSO 就是必须的)

进到 安全性->认证机制->LTPA 页面,这一步就不贴图了,设置任意的密码。再在该页的下方点 单次注册(SSO),然后只勾选上 已启用确定保存 就 OK 啦。

LTPA 是轻量级第三方认证(Lightweight Thrid Party Authertication)。启用了 LTPA 后会在请求中生成 LTPA Token (令牌).

④ 最后要启用 全局安全限,进 安全性->全局安全限 页面,照图中设置:

关键选项:

已启用 勾上
执行 Java 2 安全性 不选
活动协议 CSI 和 SAS
活动认证机制 如果配置了 LTPA 则可选 LTPA,也可选 SWAM
活动用户注册表 选 定制

确定保存后,控制台的设置就完成了。

4. 应用安全性,实现 Jdbc 用户验证和 SSO

① 进入控制台

前面的步骤完成后,可以 stopServer.bat server1 停掉 WAS 了,然后可以用 startServer.bat server1 启动 WAS,也可以带上用户名和密码参数来启动 WAS,完整命令是:startServer.bat server1 -username unmi -password 123456。(用在控制台中为定制 JdbcRegistry 配置的用户名)。

但是切记,配置好了安全性的 WAS 在停止服务时,一定要加上用户名和参数,如 stopServer.bat server1 -username unmi -password 123456,否则无法结束服务。

再次打开控制台:http://localhost:9090/admin,这时你会发现会弹出一个安全警告,接受后,请求自动定向到 9043 (HTTP协议端口上,这个端口依赖你的配置,默认为 9043),然后要求输入用户名和密码,你只有输入为 JdbcRegistry 指定的用户密及相应密码方能进入控制台。届此,我们已经成功了半步。

② 部署测试应用

下载 TestJdbcRegistry.zip,改名为 TestJdbcRegistry1.war,然后部署到 WAS 的 server1 服务器上,取上下文根为 test1, 部署过程只有第 4 步与通常不同。如下图,需要勾选上 所有已认证的用户。其他都一样的。

然后启动 WasJdbcRegistry 应用.

③ 感受 SSO,单点登陆

未完,待续。。。。。。

参考资料:1. Configuring custom user registries
             2. 为何不直接使用 Oracle 提供的连接池实现
             3. Tomcat 和 OpenLDAP, 从配置到应用

控制台登录验证用户时执行的方法
checkPassword
getUniqueUserId
getUniqueGroupIds


http://swingchen.bokee.com/3194578.html




[版权声明]
本站内文章,如未标注 [转载],均系原创或翻译之作,本人 Unmi 保留一切权利。本站原创及译作未经本人许可,不得用于商业用途及传统媒体。网络媒体可随意转载,或以此为基础进行演译,但务必以链接形式注明原始出处和作者信息,否则属于侵权行为。另对本站转载他处文章,俱有说明,如有侵权请联系本人,本人将会在第一时间删除侵权文章。及此说明,重之之重。
posted on 2008-01-27 14:51 隔叶黄莺 阅读(1155) 评论(3)  编辑  收藏 所属分类: Mid-Ware

Feedback

# re: WAS 安全性中定制用注册表,通过 JDBC 验证用户实现 SSO 2008-01-27 22:45 Robin's Java World
好文章,先顶了。  回复  更多评论
  

# re: WAS 安全性中定制用注册表,通过 JDBC 验证用户实现 SSO 2008-02-24 07:48 Mu
You have database user password saved in clear. This may lead to security issue. It is better to be encrypted.

Now I have a more difficult problem that the userid in our database is not unique. Instead a hardware identifier is embedded in the http request and the hardware identifier + userid is unique. Do you have an idea of how to provide an authentication solution for this in WAS6.1?

Form based authn is preferred.

Thanks  回复  更多评论
  

# re: WAS 安全性中定制用注册表,通过 JDBC 验证用户实现 SSO 2008-02-24 11:11 隔叶黄莺
定制 JdbcRegistry 中的 验证方法,总能满足你的要求,至于说用户id不唯一,恐怕不妥,在整个 Ldap 中,所有用户的 uid 都不能重复的。  回复  更多评论
  


标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-01-27 16:23 编辑过
 
 
相关链接:
网站导航: