【IT168 技术文章】
引言
在当前的 SCA 组装模型规范文档中,QoS 并不是规范的主要组成部分,而仅在附录中对其进行了定义。它列出了三个域的标准 SCA 策略元素和属性:安全、事务和可靠消息传递。
WebSphere Process Server 和 WebSphere Integration Developer 一起提供了这些域的一个实现。对打包为 SCA 模块的 SCA 组件进行连接时,可以指定 QoS 限定符。这些限定符可为 SCA 组件提供服务质量保证,同时也为这些组件的客户端提供了服务质量保证。可以在三个级别定义限定符:
引用
接口
实现
根据限定符具体情况,定义可能在特定的级别不可用。安全限定符只能在以下两个级别定义:
接口:在此级别,可以定义 SCA 组件的安全权限。允许定义 J2EE 角色,因此只有与此角色关联的客户端才被授权调用组件。
实现:在此级别,可以定义 SCA 组件的安全标识。允许定义组件标识,与为 Enterprise Java Bean (EJB) 定义委托策略(也称为 Run-As 模式映射)的方式相似。它允许将组件的所有方法作为特定安全角色的成员运行。
所有限定符都在服务组件定义语言(Service Component Definition Language,SCDL)文件的特定部分定义,此文件用于定义 SCA 组件的接口、实现和服务质量要求。
现在我们将演示一个使用 WebSphere Integration Developer 开发的简单示例,从而说明如何在 SCA 组件上定义安全限定符。本文所使用的 WebSphere Integration Developer 版本为 6.0.1。
关于示例应用程序
您将把一个项目交换文件导入到 WebSphere Integration Developer 中,该文件中包含一个预先构建的示例,此示例由具有一个 SCA 组件的 SCA 模块、此组件的 Java 实现和调用它的 JSP 测试页组成。还包含了一个基于表单的登录页,以允许登录到该示例。
图 1 显示了 CreditApprovalSCAModule SCA 模块的组成情况,其中包含 CreditApproval SCA 组件和一个独立的引用(因为 CreditApproval 由 JSP——非 SCA 组件进行调用)。
图 1. CreditApprovalSCAModule SCA 模块

导入示例
首先,需要下载示例,并将其导入到 WebSphere Integration Developer 工作区。
将本文所包括的项目交换文件下载到您的硬盘。项目交换文件是压缩归档文件,其中包含所有源项目(包括 SCA 模块)。
在 WebSphere Integration Developer 中打开一个空白工作区,并关闭欢迎屏幕。Workbench 应在 Business Integration 透视图中打开。
要导入项目交换文件,请右键单击 Business Integration 视图并选择 Import。
选择 Project Interchange,然后选择 Next。
浏览到下载的文件,然后单击 Select All 和 Finish。如果在 Problems 选项卡中看到错误,请单击 Project 菜单,然后单击 Build Automatically 取消选中,然后单击 Build All,从而重新构建项目。
展开 CreditApprovalSCAModule 模块(图 2)。
图 2. 展开的 CreditApprovalSCAModule

请对 CreditApproval SCA 组件的 CreditApproval 接口和 CreditApprovalImpl Java 实现加以注意。
定义安全角色
接下来,我们将定义安全角色。安全角色是具有安全资源(如 Servlet、JSP、EJB 或 SCA 组件)及方法的访问权限的命名用户集。在示例中,我们希望保护的资源是调用 SCA 组件的 JSP 和 SCA 组件本身。角色将在应用程序部署时映射到实际的用户和组(在称为安全角色映射 的过程期间进行)。
对于我们的示例,安全角色已经在导入的项目交换文件中进行了定义。
为了便于使用,我们经常使用 J2EE 透视图。对于某些产品许可证,此透视图可能不可用。如果看不到此透视图,可以向 Business Integration 透视图添加 Navigator 视图,但无法使用部署描述符编辑器。
从 Window 菜单中选择 Preferences。
展开 Workbench,并单击 Capabilities。
选中 Advanced J2EE,然后单击 OK。
从 Window 菜单中选择 Open Perspective - Other...
选择 J2EE,然后单击 OK。
在 Project Explorer 视图中,依次展开 Dynamic Web Projects、CreditApprovalClient 项目和 WebContent(图 3)。
图 3. CreditApprovalClient 内容

包含调用 SCA 组件的 JSP (creditApprovalClient.jsp) 和基于表单的登录页 (login.html) 的 Web 项目。
双击 CreditApprovalClient Web 项目的部署描述符,并检查 Security 选项卡的内容(图 4)。
定义了三个角色(manager、nonManager 和 delegate)。JSP 上还有一个访问安全约束。映射到其中一个角色的所有用户都被授予了访问该 JSP 的权限。
图 4. Security 选项卡

接下来,我们将定义 CreditApproval SCA 组件的安全权限。将只授权具有 manager 角色的用户访问 SCA 组件。
返回 Business Integration 透视图。
双击 CreditApprovalSCAModule 模块。
单击 CreditApproval 组件。
转到 Properties 视图,单击 Details 并切换到 Qualifiers 选项卡。
将会选择 Interfaces 项。可以将所有接口限定符应用到组件的三个级别:
用于其所有接口
用于单个接口
用于接口的单个操作
操作的限定符将覆盖接口的限定符,而接口的限定符将覆盖组件的所有接口的限定符。我们此处仅有一个操作和一个接口,因此可以在任何级别定义限定符。
单击 Add 按钮,以显示可用的服务质量。
选择 Security permission 并单击 OK。
选择 Security permission 限定符,并在 Role 字段中输入 manager(图 5)。
图 5. Qualifiers 选项卡

保存并关闭模块。
定义安全角色映射
接下来,我们需要将用户映射到我们定义的 manager nonManager 和 delegate 角色。我们将在企业应用程序的部署描述符中定义此映射。我们的文件包含预定义的映射,因此需要使用自己的用户代码替换原有的用户代码。
返回 J2EE 透视图。
在 Project Explorer 视图中,展开 Enterprise Applications 和 CreditApprovalSCAModuleApp 应用程序。
双击 CreditApprovalSCAModuleApp 部署描述符,并切换到 Security 选项卡。
选择 manager 角色(图 6)。
图 6. 企业应用程序的 Security 选项卡

选择 bcp 用户,单击 Edit... 按钮,并使用您操作系统的有效用户替换其中的值。
采用相同的方式将 db2admin 用户映射到 nonManager 角色,将 bruno 用户映射到 delegate 角色。
保存并关闭编辑器。
在 WebSphere Process Server 上设置全局安全性
我们将使用 WebSphere Process Server Test Environment 来测试示例。您需要使用管理控制台设置安全性,并修改在 Test Environment 安装期间设置的一些缺省参数。在此示例中,我们将配置与本地操作系统用户注册表一起使用的安全设置。当然,也可以使用自定义注册表或 LDAP。
切换到 J2EE 透视图。
在 Servers 选项卡上右键单击 WebSphere Process Server 并选择 Start。
服务器启动后,右键单击该服务器并选择 Run administrative console。
修改 J2C 身份验证数据
在测试环境的安装期间,一些 J2C 身份验证数据项是使用缺省用户创建的。您需要将其修改为您的有效用户,特别是 SCA 用于登录到受保护的 SIBus 的别名。
登录,展开 Security 项,并选择 Global security。
在 Authentication 项中展开 Jaas Configuration 并单击 J2C Authentication data。
必须更改所有包含 wid 用户的别名,将其替换为您的用户(图 7)。
图 7. J2C 身份验证数据项

设置全局安全性
修改了所有项后,返回到 Global security 面板。
选中 Enable global security 属性,并取消选中 Enforce Java 2 security 属性,然后单击 OK。
在 Local OS user registry 面板上输入有效的用户和密码,然后单击 OK。
保存更改,从管理控制台注销,并停止服务器。
修改服务器配置
在 Servers 选项卡上双击服务器。
展开 Security,选中 Security is enabled on this server 并输入有效的用户和密码。
在 Server connection type and admin port 面板上选择 SOAP,以确保服务器正确启动(图 8)。
图 8. 服务器配置

保存并关闭编辑器。
右键单击服务器,并选择 Start。
服务器启动时,右键单击该服务器并选择 Add and remove projects...。
从列表中选择 CreditApprovalSCAModuleApp 应用程序,并单击 Add 按钮。单击 Finish,等待部署完成。
展开 Dynamic Web Projects、CreditApprovalClient 和 Webcontent。
右键单击 creditApprovalClient.jsp 并选择 Run - Run on Server...
选择 WebSphere Process Server 并单击 Finish。
将随即显示登录页面。输入具有 manager 角色的用户代码及密码(图 9)。
图 9. 登录页

在下一页的 First Name 和 Last Name 字段中输入有效值,在 Customer Id 字段中输入 1,然后单击 SubmitCreditApp 按钮。
由于 SCA 组件授权给具有 manager 角色的用户,因此页面上将显示信用查询结果(图 10)。
图 10. 结果页

现在已经成功连接了,接下来请关闭浏览器,重新启动服务器并运行 creditApprovalClient.jsp,但这次使用 nonManager 类用户登录。
对于此用户,未授权访问 SCA 组件,因此将显示一条错误消息。
在示例中,SCA 服务运行时引发的异常将由 JSP 捕获,并在页面上显示相应的异常消息(图 11)。
图 11. 访问未授权

关闭 Web 浏览器并停止服务器。
定义安全标识
SCA 组件的安全标识与 EJB run-as 委托策略相似。即,SCA 组件的实现代码将使用调用方标识执行。在我们的示例中,调用方是 JSP 页。如果观察一下结果页(图 10),您会注意到显示的是 Run-As user,即执行 SCA 组件的 Java 实现代码 (CreditApprovalImpl.java) 的用户。
但可以修改此缺省行为,而将组件的所有方法委托为作为特定安全角色的成员运行。要在 SCA 组件的实现级别定义此特定角色。
此后,必须在部署期间分配一个是指定的安全角色的成员的实际用户。
要获取 Java 实现中的 Run-As 用户代码,请使用 JAAS Subject 和用户经过 WebSphere Process Server 身份验证时创建的公共凭据。清单 1 显示了用于检索 Run-As 用户的 Java 代码。
清单 1. 获取 Run-As 用户
2
3 WSCredentialImpl pubCred = null;
4
5 Subject sujetWS = WSSubject.getRunAsSubject();
6
7 Set set = sujetWS.getPublicCredentials();
8
9 if (!set.isEmpty()) {
10
11 pubCred = (WSCredentialImpl) set.iterator().next();
12
13 }
14
15 creditRating.setString("customerId", creditApplication
16
17 .getString("customerId")
18
19 + " Run-As user : " + pubCred.getSecurityName());
20
21 } catch (Exception e) {
22
23 }
24
25
在实现级别定义安全标识
在 Business Integration 透视图中双击 CreditApprovalSCAModule 模块。
单击 CreditApproval 组件。
转到 Properties 视图,单击 Impementation 并切换到 Qualifiers 选项卡。
单击 Add 按钮,以显示可用的服务质量。
选择 Security identity 并单击 OK。
选择 Security identity 限定符,并在 Privilege 字段中输入 delegate(图 12)。
图 12. 安全标识

保存并关闭模块。
要使用 SCDL 来定义安全权限和标识。SCDL 定义存储在多个文件中,但安全元素和接口及实现定义一起存储在名为 CreditApplication.component 的文件中。
要 Business Integration 透视图中检查此文件的内容(图 13),请从 Window 菜单中选择 Show View - Physical Resources。展开 CreditApprovalSCAModule。
图 13. SCDL 定义

将用户分配给安全标识
用户只能在部署时使用管理控制台映射到安全标识。对于当前的版本,为了完成此工作,必须从 Ear 文件部署应用程序。
切换到 J2EE 透视图。
从 File 菜单中选择 Export...。选择 EAR file 并单击 Next 按钮。
选择 CreditApprovalSCAModuleApp EAR 项目和一个目标文件。单击 Finish。
在 Servers 选项卡上,启动 WebSphere Process Server。
右键单击 WebSphere Process Server 并选择 Run administrative console。
登录,然后在 Applications 项中选择 Enterprise Applications。
选择 CreditApprovalSCAModuleApp 并单击 Stop。
选择 CreditApprovalSCAModuleApp 并单击 Uninstall。单击 OK。
单击 Install,然后单击 Browse 按钮。选择之前保存的 Ear 文件,并单击 Next,然后再单击 Next。
单击 Step 7: Map RunAs roles to users。
选中 delegate 角色,并输入映射到委托角色的用户代码和密码。单击 Apply(图 14)。
图 14. Map RunAs roles to users

单击 Next,然后单击 Next 和 Finish。
保存到主配置。如果出现保存冲突,请为所有项选择 Overwrite。
从 Applications 菜单中选择 SCA modules。
选择 CreditApprovalSCAModule 并单击 Start。
测试安全标识
在 J2EE 透视图中依次展开 Dynamic Web Projects、CreditApprovalClient、Webcontent。
右键单击 creditApprovalClient.jsp 并选择 Run - Run on Server...
选择 WebSphere Process Server 并单击 Finish。
将随即显示登录页面。输入具有 manager 角色的用户代码及密码。
在下一页的 First Name 和 Last Name 字段中输入值,在 Customer Id 字段中输入 1,然后单击相应按钮
页面上将显示具有 delegate 角色的用户为 Run-As 用户(图 15)。请注意,可以为安全标识选择未授权访问 SCA 组件的角色。
图 15. RunAs 结果页

结束语
服务质量是 SCA 的一项重要特性,而安全又属于可用于的 QoS 限定符的一部分。本文介绍了 SCA 组件的两个安全限定符(安全权限和安全标识),并讨论了可以如何使用 WebSphere Integration Developer 6.0.1 定义和使用这些限定符。