快捷搜索:

Java Web 服务: Metro 服务下的 WS-Security

正如 “Metro 简介” 所述,JAXB 2.x 数据绑定的参考实现和 JAX-WS 2.x 收集办事规范是 Metro 收集办事框架的核心。然则 JAXB 与 JAX-WS 本身只供给基础的收集办事支持,JAX-WS 并不包括 WS-* 技巧,不能进级 SOAP 以便在企业级利用情况中事情,以是必要一些其他的软件组件来支持 WS-* 技巧。

在 Metro 中,添加的主要组件是 Web 办事互操作性技巧(Web Services Interoperability Technologies,WSIT)。WSIT 是原本称为 Project Tango 确当前版本,Project Tango 是 Sun 公司为实现某些 WS-* 特点(包括安然靠得住的消息通报)与 Microsoft .NET 平台之间的互操作性而付出的努力。WSIT 向 Metro 供给 WS-SecurityPolicy、WS-Trust、WS-SecureConversation、WS-ReliableMessaging 等办事规范支持。而 WS-Security 的实际运行时处置惩罚由别的一个添加的组件 —— XML and WebServices Security Project (XWSS) 来实现。

本文展示若何经由过程 Metro 来应用和设置设置设备摆设摆设 WS-Security,将其作为一个自力的 Web 利用法度榜样在 Glassfish 办事器外部应用。拜见 下载 部分获取本文中的整个示例的完备源代码,该代码实现了此前在本系列中应用的简单藏书楼治理办事。

WSIT 根基

WSIT 认真设置设置设备摆设摆设 Metro 运行时以匹配一个办事的 WS-Policy 规范,包括诸如 WS-SecurityPolicy 之类的 WS-Policy 扩展。除标准的 WS-Policy 扩展外,Metro 还应用策略文档中的自定义扩展来设置设置设备摆设摆设实现安然处置惩罚所需的用户信息(如密匙存储位置和密码)。

WSIT 从 Web Services Description Language (WSDL) 办事描述中获取策略信息。在客户端,这可能难以理解一些,由于用于 WSIT 设置设置设备摆设摆设的 WSDL 与用于定义 JAX-WS 办事的 WSDL 是分开的。如 “Metro 简介” 所述,用于设置设置设备摆设摆设 JAX-WS 客户真个 WSDL 可以直接从办事获取,也可以从天生 JAX-WS 代码之时指定的位置获取。WSIT 应用的 WSDL 有一个固定的文件名(虽然这个文件能够应用一个标记来引用一个带有完备 WSDL 的自力文件),并且老是经由过程类路径造访。

在办事器端,WSIT 要求在 WEB-INF/sun-jaxws.xml 设置设置设备摆设摆设文件(在 “Metro 简介” 中先容过)中指定的位置供给 WSDL。所供给的 WSDL 必须包孕用于为 WSIT 设置设置设备摆设摆设用户信息的自定义扩展,然则这些自定义扩展在为相应对办事端点的 HTT PGET 哀求而供给的 WSDL 版本中被删除掉落了。

这些用于设置设置设备摆设摆设 WSIT 用户信息的自定义扩展在办事器端和客户端看起来一样,然则在用于扩展元素的 XML 名称空间中不合。在客户端,名称空间是 http://schemas.sun.com/2006/03/wss/client;在办事器端,名称空间是 http://schemas.sun.com/2006/03/wss/server。

Metro 中的 UsernameToken

“Axis2 WS-Security 根基” 应用了一个简单的 UsernameToken 例子来先容 Axis2/Rampart 情况下的 WS-Security。UsernameToken 供给了一种经由过程 WS-Security 来表示 “用户名/密码” 对的标准措施。密码信息可以以纯文本要领(平日,这种要领只有在同时设置设置设备摆设摆设了传输层安然协议(Transport Layer Security,TLS)或者应用 WS-Security 加密时才会在临盆中应用 — 然则这种要领确凿便于测试)或者以散列值要领发送。

要在 Metro 上实现一个简单的纯文本款式的 UsernameToken 示例,您必要在 WSDL 办事定义中恰当定义 WS-Policy/WS-SecurityPolicy。清单 1 展示了 “Metro 简介” 中应用过的一个根基 WSDL 办事定义的修订版,包孕了在从客户端到办事器的哀求上要求 UsernameToken 的策略信息。与策略本身一样, 中的策略引用以粗体显示。

清单 1. 纯文本 UsernameToken WSDL

...

...

...

...

清单 1 WSDL 奉告我们,要造访办事必要进行哪些安然处置惩罚。您必要同时在办事器端和客户端向策略信息中添加 WSDL 自定义扩展,经由过程用户设置设置设备摆设摆设细节注解若何实现安然处置惩罚。这些自定义扩展被加入到了 WSDL 中的组件。下一步,我将向您展示每一真个扩展示例。

客户端利用

在客户端,应用一个名为 wsit-client.xml (这个文件名是固定的)的文件来进行 WSIT 设置设置设备摆设摆设。这个文件必须位于根目录的路径下(不在任何包中),或者在类路径的一个目录的 META-INF 子目录中。而 wsit-client.xml 必须是能直接供给整个 WSDL 办事或经由过程引用某个自力的 WSDL 办事定义的 WSDL 文档。无论哪一种要领,WSDL 都必须包孕 WS-Policy/WS-SecurityPolicy 的整个请乞降 WSIT 设置设置设备摆设摆设扩展。

清单 2 展示了 清单 1 WSDL 中的策略部分,经由过程添加一个 WSIT 自定义扩展来设置设置设备摆设摆设客户端 UsernameToken 支持。在这里,那个自定义扩展是元素及其子元素,以粗体显示。两个子元素定义回调类,第一个定义用户名(name="usernameHandler"),第二个定义密码(name="passwordHandler")。指定的类必须实现 javax.security.auth.callback.CallbackHandler 接口。

清单 2. 带有 WSIT 客户端扩展的 UsernameToken 策略

在 清单 2 中,所有的回调必须应用相同的类。清单 3 是回调类的代码,感化是反省每个回调哀求的类型并恰当地为其赋值:

清单3. 客户端回调代码

public class UserPassCallbackHandler implements CallbackHandler

{

public void handle(Callback[] callbacks) throws UnsupportedCallbackException {

for (int i = 0; i

您并不是必须 应用回调来设置用户名或密码。假如用户名和密码被付与的是固定值,您可以直接在元素中设置它们,措施是应用 default="yyy"(在这里,属性值即实际的用户名和密码)来调换 classname="xxx" 属性。

办事器端利用

在办事器端,WSIT 设置设置设备摆设摆设信息必要包孕在 WSDL 办事定义中。如 “Metro 简介” 所述,办事 WSDL 的位置可以在办事 WAR 文件中的 WEB-INF/sun-jaxws.xml 里指定为一个参数。假如不应用 WSIT 特点,则 WSDL 是可选的;在这种环境下,WSDL 将在运行时自动天生。假如应用 WSIT 功能,则 WSDL 是必须的,并且必须包孕为办事所用的特点设置设置设备摆设摆设 WSIT 所需的随意率性自定义扩展元素。清单 4 展示了 清单 1 WSDL 办事的策略部分,此次添加了一个 WSIT 自定义扩展元向来设置设置设备摆设摆设 UsernameToken 支持(以粗体显示):

清单 4. 带有 WSIT 办事器端扩展的 UsernameToken 策略

清单 4 中的办事器端 WSIT 扩展以元素和子元素形式表示,指定将作为验证器回调应用的类。清单 5 给出了这个类的代码,这个类必须实现 com.sun.xml.wss.impl.callback.PasswordValidationCallback.PasswordValidator 接口。在这里,它只是针对固定值反省供给的用户名和密码,但它可以轻松应用一个数据库查询或其他机制替代。

清单5. 办事器回调代码

public class PasswordValidator implements PasswordValidationCallback.PasswordValidator

{

public boolean validate(Request request) throws PasswordValidationException {

PasswordValidationCallback.PlainTextPasswordRequest ptreq

= (PasswordValidationCallback.PlainTextPasswordRequest)request;

return "libuser".equals(ptreq.getUsername()) &&

"books".equals(ptreq.getPassword());

}

}

Metro 策略对象

Metro/WSIT 要求您向 WSDL 文件添加设置设置设备摆设摆设信息,就像应用 Axis2/Rampart 一样。这个系列中此前先容 Axis2/Rampart 的文章在构建历程中应用了一种特殊的策略对象来根据必要天生颠末改动的 WSDL 文件。本文的示例代码 下载 部分包孕一种相似的对象,它根据 Metro/WSIT 的必要而设计。

这个对象便是 com.sosnoski.ws.MergeTool 利用法度榜样,在示例代码的 mergetool 目录中。MergeTool 用于将数据合并到目标 XML 文件中,匹配嵌套的 XML 元素,找到必要合并的数据并在目标文档中确定命据的合并点。示例法度榜样的 build.xml 应用 MergeTool 将客户端或办事器的 WSIT 设置设置设备摆设摆设信息添加到办事的 WSDL 中。假如乐意,您也可以在自己的利用法度榜样中应用 MergeTool — mergetool/readme.txt 文件包孕一些根基的应用阐明,您也可以在供给的构建中看到 MergeTool 的应用措施。

假如没有 ,Metro 将应用您的 Web 利用法度榜样容器(供给 servlet 的 Web 办事器)所供给的授权机制。

您可能还会对下面的文章感兴趣: