如何在 IBM Operational Decision Management 中保护托管的透明决策服务

本文探讨了用于在 IBM® Operational Decision Manager 中保护托管的透明决策服务的一项技术。身份验证和授权在生产环境中往往是必不可少的。您将学习如何配置托管的透明决策服务,以便连接到 LDAP 进行身份验证,本文还将介绍如何定义额外的代码,以便验证调用的用户 ID 是否有权调用规则项目。 本文来自于 IBM Business Process Management Journal 中文版

Tamer Nassar, 软件工程师, IBM

Tamer Nassar 是 IBM CIO 办公室的一名软件工程师,自 2000 年就一直在 IBM 工作。他参与过很多不同的项目,用各种技术设计、实现和测试过大量端到端的企业解决方案。他感兴趣并擅长的领域包括 SOA、IT 架构和方法学、WebSphere Application Server、WebSphere Process Server、WebSphere MQ 和 WebSphere Message Broker。



Murali Vridhachalam, IT 架构师, IBM

Murali Vridhachalam 是一名通过了 Open Group 认证的 IT 架构师,自 2005 年早期就开始接触 XBRL。他曾在 IBM 首次通过 XBRL 提交财务报表时担任过主管架构师,这是 SEC 的 XBRL 自主文件项目的一部分。他目前感兴趣的领域包括 SOA 和使用 IBM 企业软件组合构建起来的 Software as a Service 功能。



Zhi Yong Mao, 软件工程师, IBM

Zhi Yong Mao 在 IBM CIO 办公室工作已有超过 6 年的时间。他关注的专业领域包括 SOA、IT 架构、J2EE、Websphere Application Server、DB2 和 PHP。



2013 年 5 月 21 日

概述

使用 IBM Operational Decision Manager (IBM ODM) 软件实现决策逻辑时,可以通过在业务人员与 IT 人员之间搭建桥梁来实现重大改进。ODM 让企业能够定义非技术人员易于理解的、可以部署到系统中用来实现自动决策的策略,从而促进负责定义需求的策略管理人员与负责实现业务系统解决方案的开发人员之间的明确沟通。

通常,有了托管的透明决策服务方法后,业务应用程序就成为通过基于 SOAP 的 Web 服务调用 IBM ODM 中业务规则的 Web 服务客户端。出于安全考虑,Web 服务客户端对托管的透明决策服务进行 SSL 调用,同时传递一个用户名和密码。托管的透明决策服务使用 LDAP 进行身份验证。如果证书有效,则会触发授权代码,根据参考表来验证调用的用户名。这个参考表中有一个 SOAP URL 列表,其中保存着所有规则项目,以及每个项目的授权 id。如果授权成功,Web 服务调用就会通过。否则,Web 服务将会获得一条错误信息。

先决条件

本文面向中级的 IBM ODM 开发人员,重点介绍一个特定的实现领域。本文从开发人员的角度假设读者对 IBM ODM 有基本的了解。本文和文中的示例均与 WebSphere ILOG V7.1、WebSphere ODM V7.5 与 IBM ODM V8 兼容。本文中的步骤基于运行在 WebSphere Application Server 上的 ODM。

自定义一个托管的透明决策服务

让我们从自定义一个托管的透明决策服务 EAR 文件并给它添加安全性开始:

导出托管的透明决策服务 EAR

在 WebSphere 上安装了 ODM 之后,登录到 WebSphere Integrated Solutions Console,并导出 jrules-res-htds 应用程序。

图 1. 导出 jrules-res-htds 应用程序
导出 jrules-res-htds 应用程序

下载 EAR 文件后,您需要修改 jrules-res-htds.ear 中的以下文件:

在 META-INF 文件夹中进行修改,以便提高托管的透明决策服务安全性

您需要更改 jrules-res-htds.ear 中 META-INF 文件夹中的三个文件(Application.xml、ibm-application-bnd.xml 和 was.policy):

图 2. META-INF 文件夹结构
META-INF 文件夹结构

更新 application.xml

在 application.xml 中,使用清单 2 中的粗体文本替换清单 1 头部中的粗体文本,以便在自定义的 EAR 文件中启用 Java EE 5 支持。

清单 1. 旧的 application.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" 
    "http://java.sun.com/dtd/application_1_3.dtd">
<application id="Application_1352340619765">
  <display-name>jrules-res-htds</display-name>
  <description>Enterprise application archive for the Websphere 
               application server.</description>
  <module>
    <web>
      <web-uri>jrules-res-htds.war</web-uri>
      <context-root>DecisionService</context-root>
    </web>
  </module>
</application>
清单 2. 更改后的 application.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<application id="Application_1352340619765" 
   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/application_5.xsd" version="5">
   <display-name>jrules-res-htds</display-name>
  <description>Enterprise application archive for the Websphere
               application server.</description>
  <module>
    <web>
      <web-uri>jrules-res-htds.war</web-uri>
      <context-root>DecisionService</context-root>
    </web>
  </module>
</application>

创建一个 ibm-application-bnd.xml 文件

重要提示:在执行这个步骤之前,需要删除 ibm-application-bnd.xmi 文件,因为 Java EE 5 不支持它。

在 META-INF 文件夹中创建一个名为 ibm-application-bnd.xml 的新文件,并在该文件中添加以下 XML 内容:

清单 3. 新的 ibm-application-bnd.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<application-bnd
	xmlns="http://websphere.ibm.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee 
	http://websphere.ibm.com/xml/ns/javaee/ibm-application-bnd_1_0.xsd"
	version="1.0">
	<security-role name="WODMSecurity">
		<special-subject type="ALL_AUTHENTICATED_IN_TRUSTED_REALMS" />
	</security-role>
</application-bnd>

现在,您已经添加了一个名为 WODMSecurity 的安全角色,将在 web.xml 中进行使用该角色。您可以为安全角色取任意名称,只要在其他文件中也使用相同的名称即可。

更新 was.policy

在 was.policy 文件中,需要添加一行用于授权给 getCallerSubject 的新内容,如下所示:

清单 4. 新的 was.policy 配置
//grant additional permissions
grant codeBase "file:${application}" {
  permission javax.security.auth.AuthPermission "wssecurity.getCallerSubject";
};

现在您已经完成了对 META-INF 文件夹中的更改,可以继续进行下一步骤。


更改 WEB-INF 文件夹中的 WAR

更改 web.xml

您需要更改 web.xml 文件,如清单 5 中所示,方法是添加过滤器标签 (AuthFilter),以验证传入的用于托管的透明决策服务的 Web 服务调用。这个过滤器将执行自定义的 com.ibm.security.AuthFilter 类。此外,您还需要添加 filter-mapping 标签,以便在所有 Web 服务调用 (/ws/*) 上应用过滤器。

清单 5. 过滤器配置
<filter>
 	<display-name>AuthFilter</display-name>
 	<filter-name>AuthFilter</filter-name>
 	<filter-class>com.ibm.security.AuthFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>AuthFilter</filter-name>
 	<url-pattern>/ws/*</url-pattern>
</filter-mapping>

添加数据库数据源,让自定义代码能够使用它连接到参考表 APP_WS_LOGIN。这个参考表中有一个 SOAP URL 的列表,其中保存着所有规则项目和每个项目的授权 id,如清单 6 中所示。

清单 6. 数据源配置
<resource-ref id="ResourceRef_1282067150040">
	<description>DB Connection</description>
	<res-ref-name>jdbc/filter</res-ref-name>
	<res-type>javax.sql.DataSource</res-type>
	<res-auth>Container</res-auth>
</resource-ref>

图 3 显示了 APP_WS_LOGIN 表的样例数据。

图 3. APP_WS_LOGIN 样例表
APP_WS_LOGIN 样例表

在 web.xml 中添加 WebSphere Application Server 身份验证安全性配置,如清单 7 中所示。

清单 7. WebSphere Application Server 身份验证安全性配置
<security-constraint>
	<web-resource-collection>
		<web-resource-name>Security Resource</web-resource-name>
		<url-pattern>/ws/*</url-pattern>
	</web-resource-collection>
	<auth-constraint>
		<role-name>WODMSecurity</role-name>
	</auth-constraint>
	<user-data-constraint>
		<transport-guarantee>CONFIDENTIAL</transport-guarantee>
	</user-data-constraint>
</security-constraint>
<login-config>
	<auth-method>BASIC</auth-method>
	<realm-name>LDAP_Server:PortNum</realm-name>
</login-config>
<security-role>
	<role-name>WODMSecurity</role-name>
</security-role>

确保角色名称 WODMSecurity 与 ibm-application-bnd.xml 中定义的完全相同。

更新 ibm-web-bnd.xmi

为 ibm-web-bnd.xmi 添加资源引用配置,如清单 8 中所示。

清单 8. 资源引用配置
<resRefBindings xmi:id="ResourceRefBinding_1282067150040" jndiName="jdbc/filter">
    <bindingResourceRef href="WEB-INF/web.xml#ResourceRef_1282067150040"/>
</resRefBindings>

在 lib 文件夹中添加 log4j JAR 文件

在 lib 文件夹中添加 log4j JAR 文件,如图 4 中所示。这个文件用于日志记录和 JSON-RPC,后者将在 DBHelper 类中使用。

图 4. lib 文件夹结构
lib 文件夹结构

添加类和配置文件

编译项目代码后,将配置文件 config.properties、log4j.xml、log4j.properties 和 com 文件夹添加到 \WEB-INF\classes\ 中。com 文件夹包含所有编译后的类,如图 7 与图 8 中所示。

图 5. 配置和类文件
配置和类文件

不要忘记更改模式,使之与您的数据库模式相匹配,如图 6 中所示。

图 6. DB 模式
DB 模式更改

现在,您需要将编译后的类添加到托管的透明决策服务 EAR 文件。将 DB 类 DBHelper.class 与 DBException.class 添加到 jrules-res-htds.ear\jrules-res-htds.war\WEB-INF\classes\com\ibm\db\,如图 7 中所示。

图 7. DB 类
DB 类

将安全类 Config.class、AuthFilter.class 和 Base64.class 添加到 jrules-res-htds.ear\jrules-res-htds.war\WEB-INF\classes\com\ibm\security\,如图 8 中所示。

图 8. 安全类
安全类

最后,重新部署 EAR 文件。确保已将您的 WebSphere Application Server 配置为连接到 LDAP!


用于客户端的 SSL 连接

为了让 Web 服务调用变得安全,您需要启用 SSL 连接:

在 Java 应用程序中通过 SSL 连接调用服务

如果需要使用 Java 应用程序通过 SSL 连接调用 Web 服务,请完成以下这些步骤:

  1. 从浏览器下载证书,并将其保存为 dpevxxx.cer,如图 9 中所示。
    图 9. SSL 证书
    SSL 证书
  2. 打开 JDK/JRE bin 目录 C:\Java\IBM\SDP\runtimes\base_v7\java\jre\bin\,使用下面的命令将 dpevxxx.cer 文件导入 truststore 中:
    keytool -import -file "C:\Downloads\dpevxxx.cer" -storepass xxxxxx 
    -keystore dpevxxx.truststore -alias dpevxxxkey -noprompt
  3. 现在设置属性 trustStoretrustStorePassword 的值,如下所示:
    System.setProperty("javax.net.ssl.trustStore","dpevxxx.truststore");
    System.setProperty("javax.net.ssl.trustStorePassword","xxxxxx");

在 Web 应用程序中通过 SSL 连接调用服务

如果需要在 Websphere Application Server 中的 Web 应用程序中通过 SSL 连接调用服务,完成以下步骤来导入签名人证书:

  1. 打开 Websphere Admin Console 并选择 Security => SSL certificate and key management,然后单击 Key stores and certificates,如图 10 中所示。
    图 10. SSL 证书和密钥管理
    SSL 证书和密钥管理
  2. 单击列表中的 NodeDefaultTrustStore 链接,如图 11 中所示。
    图 11. NodeDefaultTrustStore
    NodeDefaultTrustStore
  3. 单击 Additional Properties 中的 Signer certificates 链接,如图 12 中所示。
    图 12. 签名人证书
    签名人证书
  4. 单击 Retrieve from port,如图 13 中所示。
    图 13. 从端口检索
    从端口检索
  5. 指定主机名称、端口号和别名,然后单击 Retrieve signer information。您会看到如图 14 中所示的结果。
    图 14. 检索签名人信息
    检索签名人信息
  6. 单击 OK 保存签名人证书。

更新客户端代码来实现 BASIC 授权

这里需要介绍一下本节的内容,我们不能只提供一堆没有文本的标题。

设置 JAX-WS 的用户名和密码

在 Web 服务客户端代码中设置用户名和密码,如清单 9 中所示:

清单 9. 设置 JAX-WS 的用户名和密码
DecisionServiceTestSecurityRule_Service service=
    new DecisionServiceTestSecurityRule_Service();  
DecisionServiceTestSecurityRule test=
    service.getDecisionServiceSOAPdpev262InnovateIbmCom();
BindingProvider bp=(BindingProvider)test;
bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "xxx@xx.ibm.com");
bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "xxxxxx");

设置 JAX-RPC 的用户名和密码

找到名为 xxx_ServiceLocator.java 的文件并搜索 _stub instanceof。然后添加用户名和密码,如清单 10 中所示。

清单 10. 设置 JAX-RPC 的用户名和密码
if (_stub instanceof com.ibm.ws.webservices.engine.client.Stub) {
    ((com.ibm.ws.webservices.engine.client.Stub) _stub).setPortName(
        decisionServiceSOAPdpev262InnovateIbmComWSDDPortName);
    ((com.ibm.ws.webservices.engine.client.Stub) _stub).setUsername("xxxx@xx.ibm.com");
    ((com.ibm.ws.webservices.engine.client.Stub) _stub).setPassword("xxxxxx");
}

结束语

恭喜您!在这么短的时间内,您已经了解了如何保护您在 IBM ODM 中托管的透明决策服务。现在,您可以安全地调用规则项目。此外,您还可以在同一台服务器上为多个规则项目提供主机服务,而这些项目却无法访问彼此的规则。每个项目都有自己的授权 id,可以用这个 id 来调用规则和访问 WSDL 文件。


下载

描述名字大小
本文的样例项目SecurityFilter.zip444KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=930763
ArticleTitle=如何在 IBM Operational Decision Management 中保护托管的透明决策服务
publish-date=05212013