WAS 安全性中定制用注册表,通过 JDBC 验证用户实现 SSO

通常 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 驱动包提供的连接池)

因为代码行太多,不在此列出,见附件 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

 

本文链接 https://yanbin.blog/was-security-jdbc-sso/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

3 Comments
Inline Feedbacks
View all comments