如何在 WebSphere Application Server V8 中配置 DB2 受信任上下文
DB2 受信任上下文指的是 DB2 中这样一种对象:它可以使应用程序与 DB2 之间建立受信任的连接。当用户使用某一用户名建立与 DB2 的连接时,DB2 会检查用这个用户名建立的连接是否符合已经定义的某一受信任上下文对象,如果符合,那么由这个用户名建立的连接就是一个受信任的连接。
受信任的连接会增强安全功能。通常情况下,某一受信任上下文会定义必要的属性,基于该受信任上下文的受信任的连接会将所有与数据库相关的操作限制在该连接的范围之内。比如只有该受信任上下文所信任的 IP 地址、所信任的用户才能通过该连接与数据库进行交互。
三层应用程序模型在客户端和数据库之间加入了中间件一层,伴随着基于 WEB 的应用以及 J2EE 技术的发展,三层应用程序模型得到了广泛的应用,其中比较有代表性的便是 IBM 的中间件产品 WebSphere Application Server(以下简称 WAS)。WebSphere Application Server 于 2011 年 6 月 17 号发布了 V8 版本,进一步增强了对 J2EE 标准以及编程模型的广泛支持。
在三层应用模型中,中间件同时负责管理客户端程序的用户验证以及与数据库的交互。在传统配置中,中间件会使用同一个用户名标识和密码建立并维护一个与数据库的连接,应用程序所有的与数据库的交互都建立在这个连接上,也就是说,该用户标识必须具有所有应用程序所需要的数据库操作的权限,并且数据库端所有的认证和审计都基于该用户标识,无论您使用的是哪个用户来登录应用程序并发起操作。因此,这种方式会带来以下安全方面的局限性:
- 用户身份的丢失:数据库无法知道客户端的实际用户,在某些场景下具有局限性。
- 消除了用户的责任性:负责任性是数据库审计方面较为重要的特性,若不知道客户端实际用户,所有的审计事件均认为是中间件负责连接的用户标识发起,不利于审计的完整性。
- 权限的不明确性:对于客户端的所有用户对数据库的所有操作的权限,中间件负责数据库连接的用户标识都应该具有,这样某些用户不应具备的权限也会暴露给它。同样,当这个用户标识的安全性弱化时,其关联的所有资源也将会被暴露。
基于上述局限,中间件产品可以使用 DB2 提供的受信任上下文对象,用以解决上述安全方面的问题。数据库的安全管理员可以定义受信任上下文,用来建立中间件和数据库之间的受信任的连接。该受信任上下文必须具备以下的属性:
- 系统授权 ID:代表能与该数据库建立受信任连接的用户标识。
- IP 地址(或者域名):代表能使用该受信任上下文建立连接的主机。
- 数据流加密:代表该受信任数据库连接上传输的数据的加密设置。
本文将详细介绍如何在 WebSphere Application Server 中配置并使用 DB2 受信任上下文,包括如何开发一个简单的样例应用、如何在 DB2 端进行受信任上下文的创建和配置、如何在 WebSphere Application Server 端进行相关配置并阐明如何对该功能进行验证。
本文主要介绍在 WAS 中如何配置并使用 DB2 受信任上下文,为充分体现这一功能,需要对安装在 WAS 上的应用设置安全访问权限,本文所使用的应用程序示例将该安全限制设置在 WEB 层,主要体现在 Servlet 中,即只有被赋予了访问权限的用户才能访问该 Servlet。为方便起见,该 Servlet 直接与数据库进行交互,Servlet 中的数据库连接代码会通过 WAS 的配置获得与 DB2 之间的受信任连接,而登陆到 Servlet 中的用户只有是 DB2 端对应的受信任上下文所信任的用户才能操作数据库,否则数据库会拒绝该用户的访问。
本章下面部分将介绍如何开发上述提到的样本应用示例。
在 Eclipse IDE 中开发动态 Web 工程,本文示例工程名为 TestDB2Servlet,其工程组织结构如图 1 所示。
图 1. 样本应用示例工程结构图
该工程中主要的内容包括类 TestServlet.java 和 web.xml 配置文件。其主要内容如代码清单 1 和代码清单 2 所示。在代码清单 1 中,代码片段 DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/TestDB") 中的 jdbc/TestDB 即为该应用程序需要配置受信任连接的数据源的 JNDI 名字;本示例仅在代码片段 ResultSet rs = stmt.executeQuery( "SELECT * FROM EJB30.CONTEXTABLE" ) 中做了一个查询数据库的操作,其中 CONTEXTABLE 是应用所对应的数据库的名字。
清单 1. TestServelt.java 类
@RolesAllowed("ServletUser") public class TestServlet extends HttpServlet implements Servlet { private static final long serialVersionUID = 1L; public TestServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); Connection con = null; try { Context ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/TestDB"); con = ds.getConnection(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery ( "SELECT * FROM EJB30.CONTEXTABLE" ); out.println("Successfully get content from DB! "); }catch( Exception ex ) { System.out.println(ex.getMessage()); }finally { if( con != null ) { try { con.close(); } catch( SQLException ex ) { System.out.println(ex.getMessage()); } } } String successMsg = "Successfully login! "; response.setContentType("text/html"); response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires",0); try { out.println("Successfully Test DB2 Trusted Context! "); out.println(successMsg); } catch ( Exception e ) { out.close(); e.printStackTrace(); } out.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } } |
在代码清单 2 中,元素 <resource-ref> 指明需要建立受信任连接的数据源,其中 <res-ref-name> 中指定的 JNDI 名称需要与代码清单 1 中的 JNDI 名称相同;元素 <security-constraint> 中定义了该 Servlet 需要进行的安全方面的配置,即对 <url-pattern> 定义的模式进行访问的限制,并定义了安全认证的角色为 <role-name>ServletUser</role-name>;最后在元素 <login-config> 中定义了该 Servlet 的安全限制为 BASIC 方式,并且只有具有 ServletUser 角色的用户才能访问。
清单 2. web.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name>TestDB2Trusted</display-name> <servlet> <display-name>webclient</display-name> <servlet-name>webclient</servlet-name> <servlet-class>com.ibm.test.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>webclient</servlet-name> <url-pattern>/webclient</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <security-role> <description>Users which are allowed to access the Web service </description> <role-name>ServletUser</role-name> </security-role> <resource-ref> <description>Trusted Context</description> <res-ref-name>jdbc/TestDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> </resource-ref> <security-constraint> <display-name>MyConstraints</display-name> <web-resource-collection> <web-resource-name>MySecurityResource</web-resource-name> <url-pattern>/webclient/*</url-pattern> <url-pattern>/TestServletForm/*</url-pattern> </web-resource-collection> <auth-constraint> <description>MyAuthRoles</description> <role-name>ServletUser</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>ServletUser</realm-name> </login-config> </web-app> |
WAS 与 DB2 之间建立受信任连接的前提条件是 DB2 已经创建了与之关联的受信任上下文。本章节将详细介绍如何在 DB2 端创建受信任上下文。本文实验所使用的 DB2 中的数据库的名字为 TESTDB2,使用的表的名字为 CONTEXTABLE。若以本文的样本程序进行测试,需要实验之前在 DB2 中创建同名数据库和表,其中表的字段可任意设置。
该 ID 用来授权作为 WAS 与 DB2 连接的认证用户。在 DB2 中创建用户,本文以 user1 作为示例,并授予该用户以 dbadm 和 secadm 的权限,如代码清单 3 所示,以管理员权限连接到数据库 TESTDB2 之后运行代码清单 3 中的命令。
清单 3. 授予系统授权 ID 相应权限
db2 => grant dbadm on database to user user1 db2 => grant secadm on database to user user1 |
创建一个 DB2 的角色(本文为 managerrole),该角色具有应用所需要的操作数据库的所有必要权限。本示例中如代码清单 4 所示。其中 contextable 为应用需要操作的数据库,本文中的示例只对数据库进行了查询,因此此处仅赋予 managerrole 角色 select 的权限。
清单 4. 创建 DB2 角色并授予权限
db2 => create role managerrole db2 => grant select on table contextable to role managerrole |
受信任上下文需要基于前述提到的系统授权 ID 以及新创建的角色,并且需要 WAS 所在机器的 IP 地址或者域名。如代码清单 5 所示。该受信任上下文代表的意义为:如果本机上的 WAS 使用 user1 建立与数据库的连接,那么该连接就是受信任连接;同时,用户 user2 和 user3 是该受信任上下文所信任的用户,当使用 user1 建立了连接之后,该连接可以将用户转化为 user2 或者 user3 并且不需要重新进行验证。(本文所使用的 WAS 和 DB2 在同一台机器上,因此此处只声明了 localhost 作为受信任 IP 地址)
清单 5. 创建受信任上下文
db2 => create trusted context ctxname based upon connection using system authid user1 attributes ( address 'localhost', address '127.0.0.1', encryption 'none') with use for user2 rolemanagerrole without authentication, user3 role managerrole without authentication enable |
本章节将详细介绍如何在 WAS 端进行配置使部署在其上的应用使用受信任连接的方式。
- 创建 JDBC Provider,命名为 DB2 Trusted Context,其实现类型(Implementation type)选择 Connection pool data source。 如图 2 所示。
图 2. 创建 DB2 的 JDBC Provider
- 创建数据源(Data Source),命名为 jdbcTestDB,选择步骤 1 中创建的 JDBC provider,在该数据源的安全配置界面上置所有为空(none),填写好 DB2 所在机器的详细信息。配置好的数据源如图 3 所示(本图只给出了较为重要的配置信息)。
图 3. 数据源配置示例
- 创建 J2C 别名,命名为 db2Trusted,使用本文第二大部分定义的数据库用户 user1,也是受信任上下文的系统授权 ID,作为别名的用户名并输入相应的密码。如图 4 所示。
图 4. 创建 J2C 别名
- 将本文第一大部分的工程 TestDB2Servlet 导出为 WAR 包,并在 WAS 上进行安装。这里需要注意的是您可以选择两种方式进行安装,一种是安装时全部默认,安装完毕之后进行受信任连接的配置;另外一种是在安装的同时进行受信任连接的配置。两种方式达到的效果一样。
如果您选择第一种方式进行安装,则在安装后点击该应用(TestDB2Servlet_war),如图 5 所示。
图 5. 安装后的应用示例
- 在应用的界面中选择 Resource Reference,选择 TestDB2Trusted – > Modify Resource Authentication Method -> Use trusted connection (one-to-one mapping) ,在 Authentication data entry 中选择上述创建的 J2C 别名 db2Trusted,点击Apply 并进行保存。如图 6 所示。
图 6. 配置受信任连接
- 如果您选择第二种方式,即在安装时进行配置,则在安装的时候步骤 Map resource references to resources 将会完成同样的受信任连接配置,该步骤的配置同图 6,因此这里不再赘述。
因为该应用的 Servlet 使用了安全限制,所以需要对该应用 web.xml 文件中定义的角色匹配实际用户。在此之前,需要该 WAS 环境配置了全局安全性,并且在使用的用户库中存在着 user1,user2,user3,user4 用户用以完成整个功能的验证。具体步骤如下所示:
- 点击应用(TestDB2Servlet_war)-> Security role to users/group mapping -> 选择 ServletUser -> Map Users -> 选择 user1,user2,user3,user4 作为 Mapped users。配置之后如图 7 所示。
图 7. 定义应用的安全角色和用户
- 若要更加清楚明确的验证 DB2 受信任连接,需要对已经定义的数据源做一些相关配置。点击前文中所配置的数据源 data source(jdbcTestDB)-> Custom properties,对属性值 traceLevel,traceFile 以及 traceFileAppend 进行相关配置。具体配置信息如图 8 所示。其中 traceLevel 定义值为 -1,代表对数据源相关的 trace 数据将被记录;traceFile 定义了该 trace 数据的目录位置;traceFileAppend 定义了 trace 文件每次是否重写,值为 true 代表每次的 trace 数据接续在之前的文件上,false 代表每次都重写 trace 日志数据。
图 8. 数据源定制属性示例
- 在本文的示例中,我们使用登陆到 Servlet 的用户名和密码传播到数据库的连接中,因此我们还需要对数据源的 custom properties 进行配置,即将属性值 propagateClientIdentityUsingTrustedContext 设置为 true。如图 9 所示。
图 9. 设置用户标识传播属性
本章节将详细介绍如何对上述配置进行验证,确保 DB2 受信任上下文在 WAS 中的配置生效。我们在前文已经阐述,对应用 TestDB2Servlet 中 Servlet 的登陆需要提供具有权限的用户名和密码,该用户必须匹配角色 ServletUser,因此我们在第三章中为该角色匹配了用户 user1,user2,user3,user4,这意味着这四个用户可以登陆该 Servlet。在清单 1 中我们定义了该 Servlet 存取数据库的代码,此段代码片段使用的数据源即是我们在第三章定义的数据源,我们在安装应用时配置了对该数据源使用受信任连接方式并且用来建立连接的用户 ID 为 user1,因此,该应用实际建立的数据库连接即是使用 user1 建立的受信任连接。如本文第二章所述,在数据库端我们定义了受信任上下文,以 user1 作为系统授权 ID,根据清单 5 的定义,则以 user1 建立的受信任连接只能转化到 user2 或者 user3,而 user4 虽然能登陆到 Servlet 却不能完成数据库的访问操作。
登陆到浏览器,输入 URL 地址 http://localhost:9080/webclient,在弹出的界面中输入用户名和密码,这里 user1,user2,user3,user4 均可以通过 Servlet 验证。此处以 user2 作为示例。
图 10. 浏览器验证
以 user2 登陆会得到如图 11 所示的界面。您可以得到如下信息提示已经正确登陆到 Servlet 并正确连接到数据库。使用 user1,user3 会达到同样的效果。
Successfully get content from DB!
Successfully Test DB2 Trusted Context!
Successfully login!
图 11. DB2 受信任连接成功示例
同时,在数据源的 trace 日志中,您可以发现,无论使用 user1,user2,user3 登陆,该应用都能正确使用 user1 连接到数据库并做相应操作。
清单 6. 数据源 trace 日志成功连接示例
[jcc][Connection@16c534a5] BEGIN TRACE_CONNECTS [jcc][Connection@16c534a5] Successfully connected to server jdbc:db2://gubin01.cn.ibm. com:50000/testdb2 [jcc][Connection@16c534a5] User: user1 [jcc][Connection@16c534a5] Database product name: DB2/NT [jcc][Connection@16c534a5] Database product version: SQL09072 [jcc][Connection@16c534a5] Driver name: IBM DB2 JDBC Universal Driver Architecture [jcc][Connection@16c534a5] Driver version: 3.59.81 [jcc][Time:2011-09-05-10:07:12.189][Thread:WebContainer : 1] [Connection@16c534a5] getDB2Correlator () returned 9.115.33.60.42528.110905140736 [jcc][Connection@16c534a5] DB2 Application Correlator: 9.115.33.60.42528.110905140736 .0000 [jcc][Connection@16c534a5] END TRACE_CONNECTS [jcc][t4] DRDA manager levels: { SQLAM=10, AGENT=10, CMNTCPIP=8, RDB=8, SECMGR=9, XAMGR=7, SYNCPTMGR=7, RSYNCMGR=5 } [jcc][Time:2011-09-05-10:07:12.189][Thread:WebContainer : 1] [Connection@16c534a5] setDB2ClientWorkstation (null) called [jcc][Time:2011-09-05-10:07:12.194][Thread:WebContainer : 1] [DB2ConnectionPoolDataSource@16c19620] getDB2TrustedPooledConnection () returned [Ljava.lang.Object;@16c535bb [jcc][Time:2011-09-05-10:07:12.194][Thread:WebContainer : 1] [DB2PooledConnection@16c535b1] getConnection ([B@1665f550, user2, <escaped>, null, null, user2null) called [jcc][Time:2011-09-05-10:07:12.195][Thread:WebContainer : 1] [Connection@16c534a5] reuse ([B@1665f550, user2, <escaped>, null, null, user2null) called [jcc][Connection@16c534a5] DB2 LUWID: 9.115.33.60.42528.110905140736.0001 [jcc][Connection@16c534a5] BEGIN TRACE_CONNECT_RESET [jcc][Connection@16c534a5] Successfully reset connection to server jdbc:db2://gubin01.cn.ibm.com:50000/testdb2 [jcc][Connection@16c534a5] User: user1 [jcc][Connection@16c534a5] Database product name: DB2/NT [jcc][Connection@16c534a5] Database product version: SQL09072 [jcc][Connection@16c534a5] Driver name: IBM DB2 JDBC Universal Driver Architecture [jcc][Connection@16c534a5] Driver version: 3.59.81 [jcc][Time:2011-09-05-10:07:12.197][Thread:WebContainer : 1] [Connection@16c534a5] getDB2Correlator () returned 9.115.33.60.42528.110905140736 [jcc][Connection@16c534a5] DB2 Application Correlator: 9.115.33.60.42528.110905140736 .0000 [jcc][Connection@16c534a5] END TRACE_CONNECT_RESET |
如果使用 user4 登陆,则只会得到如下的信息,证明应用并没有成功建立与数据库的连接。如图 12 所示。
Successfully Test DB2 Trusted Context!
Successfully login!
图 12. DB2 受信任连接失败示例
同时,在 WAS 的日志 SystemOut.log 以及数据源的 trace 日志中,我们可以发现代码清单 7 所示的异常信息。从异常信息中可以分析出,user4 并不是 DB2 中受信任上下文的受信任用户,因此会抛出“Trusted user switch failed”这样的错误。
清单 7. 数据源 trace 日志连接失败
SystemOut.log 日志异常信息: [9/5/11 10:07:33:063 EDT] 00000011 ConnectionEve A J2CA0056I: The Connection Manager received a fatal connection error from the Resource Adapter for resource jdbc/TestDB. The exception is: com.ibm.db2.jcc.am. DisconnectRecoverableException: [jcc][t4][2040][11215][3.59.81] An error occurred during a deferred connect reset and the connection has been terminated. See chained exceptions for details. ERRORCODE=-4499, SQLSTATE=null:com.ibm.db2.jcc.am.SqlException: [jcc][t4][20130][12466][3.59.81] Trusted user switch failed. ERRORCODE=-4214, SQLSTATE=null:com.ibm.db2.jcc.am.SqlSyntaxErrorException: USER4 ;CTXNAME;1; [9/5/11 10:07:33:064 EDT] 00000011 SystemOut O [jcc][t4][2040][11215][3.59.81] An error occurred during a deferred connect reset and the connection has been terminated. See chained exceptions for details. ERRORCODE=-4499, SQLSTATE=null 数据源 trace 日志异常信息: [jcc][Thread:WebContainer : 0][SQLException@165a75d3] Message = [jcc][t4][20130][12466][3.59.81] Trusted user switch failed. ERRORCODE=-4214, SQLSTATE=null [jcc][Thread:WebContainer : 0][SQLException@165a75d3] Stack trace follows com.ibm.db2.jcc.am.SqlException: [jcc][t4][20130][12466][3.59.81] Trusted user switch failed. ERRORCODE=-4214, SQLSTATE=null at com.ibm.db2.jcc.am.dd.a(dd.java:660) at com.ibm.db2.jcc.am.dd.a(dd.java:60) at com.ibm.db2.jcc.am.dd.a(dd.java:112) at com.ibm.db2.jcc.t4.a.H(a.java:591) at com.ibm.db2.jcc.t4.a.I(a.java:612) at com.ibm.db2.jcc.t4.a.g(a.java:617) at com.ibm.db2.jcc.am.o.a(o.java:206) at com.ibm.db2.jcc.am.bn.a(bn.java:2974) at com.ibm.db2.jcc.am.bn.a(bn.java:659) at com.ibm.db2.jcc.am.bn.executeQuery(bn.java:643) at com.ibm.ws.rsadapter.jdbc.WSJdbcStatement.pmiExecuteQuery(WSJdbcStatement.java:1723) at com.ibm.ws.rsadapter.jdbc.WSJdbcStatement.executeQuery(WSJdbcStatement.java:1014) at com.ibm.test.TestServlet2.doGet(TestServlet2.java:44) at javax.servlet.http.HttpServlet.service(HttpServlet.java:575) at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1147) at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:722) at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:449) atcom.ibm.ws.webcontainer.servlet.ServletWrapperImpl. handleRequest(ServletWrapperImpl.java:178) at com.ibm.ws.webcontainer.filter.WebAppFilterManager. invokeFilters(WebAppFilterManager.java:1020) at com.ibm.ws.webcontainer.servlet.CacheServletWrapper. handleRequest(CacheServletWrapper.java:87) at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:886) at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1655) at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195) at com.ibm.ws.http.channel.inbound.impl .HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452) at com.ibm.ws.http.channel.inbound.impl. HttpInboundLink.handleNewRequest(HttpInboundLink.java:511) at com.ibm.ws.http.channel.inbound.impl. HttpInboundLink.processRequest(HttpInboundLink.java:305) at com.ibm.ws.http.channel.inbound.impl. HttpICLReadCallback.complete(HttpICLReadCallback.java:83) at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener. futureCompleted(AioReadCompletionListener.java:165) at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217) at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture .java:161) at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138) at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204) at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775) at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1650) Caused by: [jcc][Time:2011-09-05-10:07:33.036][Thread:WebContainer : 0][CallableStatement@166f5a73] setInt (17, 1208) called [jcc] [t4][time:2011-09-05-10:07:33.040][Thread:WebContainer : 0] [tracepoint:1][Request.flush] |
本文主要向大家介绍了如何在 WAS 中配置 DB2 受信任上下文,使 WAS 上安装的应用程序使用受信任连接与 DB2 进行交互,增强了应用程序以及 DB2 的安全性。除此之外,本文简要介绍了用以测试 DB2 受信任上下文的样本程序,旨在为在 WAS 上使用 DB2 受信任上下文的用户一个有益的参考。
学习
- WebSphere Application Server V8 信息中心
- DB2 V9.7 信息中心
- 在 DB2 应用中使用受信任上下文 (developerWorks,2006 年 10 月)
- Data Web Services on WebSphere Application Server, Part 3: Leverage DB2 trusted context support using Data Studio(developerWorks,2008 年 5 月)
- IBM developerWorks 中国 WebSphere 专区:为使用 WebSphere 产品的开发人员准备的技术信息和资料。这里提供产品下载、how-to 信息、支持资源以及免费技术库,包含 2000 多份技术文章、教程、最佳实践、IBM Redbook 和在线产品手册。
获得产品和技术
- 最受欢迎的 WebSphere 试用软件下载:下载关键 WebSphere 产品的免费试用版。
- IBM developerWorks 软件下载资源中心:IBM deveperWorks 最新的软件下载。
- IBM developerWorks 工具包:下载关键 WebSphere 最新的产品工具包。