Java Web服务: WS-Security的细粒度使用

在简单 Web 服务环境中,客户机直接连接到服务器,而服务器直接对请求执行所有必需的处理。正如本系列 上一篇文章 所述,使用 SSL 提供保护的连接可以为这类环境中的大部分应用提供出色的安全性。但是,更加复杂的环境变得越来越普遍,其中涉及到使用多层服务器处理请求。在许多企业环境中日益流行的服务编排的完整理念就是以这种方法为基础的,这与面向服务架构(SOA)的概念相同。在这些类型的环境中,必须实现更强大的 WS-Security 替代方案。

正如上一期文章所述,WS-Security 带来了沉重的性能代价。降低成本的方法之一就是针对由服务定义的各个操作甚至是消息设置合适的 WS-SecurityPolicy,而不是将单个 WS-Security 策略应用到整个服务。WS-Security 的细粒度使用要求考虑更多的内容,而不是使用一成不变的方法,但是如果得到正确应用的话,那么就可以减少常用操作的性能开销,同时不会减弱需要 WS-Security 的操作的安全性。

定义策略

本文使用的样例策略与 “Axis2 WS-Security 基础” 和 “Axis2 WS-Security 签名和加密” 中的策略相同 — 一个简单的库管理服务。这个服务定义了三种操作:

getBook,检索由 International Standard Book Number (ISBN) 标识的特定图书的细节。

getBooksByType,检索某一类型的所有图书的细节。

addBook,向库中添加一本新书。

为了向安全用例中添加一些有趣的变化,本文作出以下假设:

getBook 操作可以安全地公开给任何人(未应用安全性)。

getBooksByType 需要授权(因此要使用 UsernameToken)。

addBook 操作需要一个审计跟踪,以跟踪是谁添加了图书(通过对请求消息进行签名实现)。

在早期文章中,您已经了解了如何配置 Axis2/Rampart:将一个 WS-SecurityPolicy 文档连接到 org.apache.axis2.client.ServiceClient 实例(在客户机端),或者将策略文档嵌入到 services.xml 服务配置(在服务器端)。这个方法可以奏效,并且可用于测试,但是对于生产应用来说,最好通过将 WS-SecurityPolicy 内嵌到 WSDL 文档将其直接关联到服务定义。WS-Policy 和 WS-SecurityPolicy 旨在为这种嵌入提供支持,并且使用来自 <wsdl:binding>、<wsdl:binding>/<wsdl:operation> 或 <wsdl:binding>/<wsdl:operation>/<wsdl:message> 定义的引用标识将被应用到绑定、操作或消息的相应策略。Axis2 1.4.1 实现对内嵌在 WSDL 中的策略的初始处理,而这个实现在当前的 Axis2 1.5 发行版代码中得到了改进。为了演示策略在 WSDL 中的使用,本文结合使用了 Axis2 1.5 发行版代码和尚未发行的最新 Rampart 代码(后者最终会作为 Rampart 1.5 发布)。

清单 1 展示了示例应用程序的 WSDL,其中添加了策略,并在相应的位置中引用。(清单 1 针对长度和宽度进行了编辑;完整的 WSDL 可以从 代码下载 中的 library.wsdl 文件获得)。每个策略定义了一个 Id 值,该值随后从相应的操作(针对 UsernameToken 策略)或消息(针对签名策略)中引用,以粗体显示所有策略。

清单 1. 具有细粒度安全策略的 WSDL<wsdl:definitions targetNamespace="http://ws.sosnoski.com/library/wsdl"
   xmlns:wns="http://ws.sosnoski.com/library/wsdl"
   xmlns:tns="http://ws.sosnoski.com/library/types"
   xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
   xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/">

  <!-- Policy for signing message, with certificate from client included in each
   message to server -->
  <wsp:Policy wsu:Id="SignOnly" xmlns:wsu=
    "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
   <wsp:ExactlyOne>
    <wsp:All>
     <sp:AsymmetricBinding
       xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
      <wsp:Policy>
       <sp:InitiatorToken>
        <wsp:Policy>
         <sp:X509Token sp:IncludeToken=".../IncludeToken/AlwaysToRecipient"/>
        </wsp:Policy>
       </sp:InitiatorToken>
       ...
      </wsp:Policy>
     </sp:AsymmetricBinding>
     <sp:SignedParts
       xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
      <sp:Body/>
     </sp:SignedParts>

    </wsp:All>
   </wsp:ExactlyOne>
  </wsp:Policy>

  <!-- Policy for UsernameToken with plaintext password, sent from client to
   server only -->
  <wsp:Policy wsu:Id="UsernameToken" xmlns:wsu=
    "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
   <wsp:ExactlyOne>
    <wsp:All>
     <sp:SupportingTokens
       xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
      <wsp:Policy>
       <sp:UsernameToken sp:IncludeToken=".../IncludeToken/AlwaysToRecipient"/>
      </wsp:Policy>
     </sp:SupportingTokens>
    </wsp:All>
   </wsp:ExactlyOne>
  </wsp:Policy>
  ...
  <wsdl:binding name="LibrarySoapBinding" type="wns:Library">

   <wsdlsoap:binding style="document"
    transport="http://schemas.xmlsoap.org/soap/http"/>
   <wsdl:operation name="getBook">
    <wsdlsoap:operation soapAction="urn:getBook"/>
    <wsdl:input name="getBookRequest">
     <wsdlsoap:body use="literal"/>
    </wsdl:input>
    <wsdl:output name="getBookResponse">
     <wsdlsoap:body use="literal"/>
    </wsdl:output>
   </wsdl:operation>

   <wsdl:operation name="getBooksByType">
    <wsp:PolicyReference
      xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
      URI="#UsernameToken"/>
    <wsdlsoap:operation soapAction="urn:getBooksByType"/>
    <wsdl:input name="getBooksByTypeRequest">
     <wsdlsoap:body use="literal"/>
    </wsdl:input>
    <wsdl:output name="getBooksByTypeResponse">
     <wsdlsoap:body use="literal"/>
    </wsdl:output>
   </wsdl:operation>

   <wsdl:operation name="addBook">
    <wsdlsoap:operation soapAction="urn:addBook"/>
    <wsdl:input name="addBookRequest">
     <wsp:PolicyReference
       xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
       URI="#SignOnly"/>
     <wsdlsoap:body use="literal"/>
    </wsdl:input>
    <wsdl:output name="addBookResponse">
     <wsdlsoap:body use="literal"/>
    </wsdl:output>
   </wsdl:operation>

  </wsdl:binding>
  <wsdl:service name="library-granular">
   ...
  </wsdl:service>
</wsdl:definitions>

清单 1 中的策略和 WSDL 均来自早期文章,不过没有按照本文的方式事先合并。但是,您会发现策略中有一处显著的不同:早期的版本都包括了 Rampart 配置信息,这些信息特定于客户机或服务器。现在策略被嵌入到 WSDL 中,因此不适合直接包含 Rampart 配置。(您需要编辑 WSDL 以包含客户机 Rampart 配置信息,并在每次发生更改时重新生成代码,而在服务器端,Rampart 配置将被公开给访问 WSDL 的任何人)。因此示例代码将单独设置配置信息。为此,对包含的 Rampart 配置使用了之前用于策略的相同技巧的不同变体。

时间: 2024-11-08 19:03:31

Java Web服务: WS-Security的细粒度使用的相关文章

Java Web服务: WS-SecureConversation性能

看看 Web 服务栈 WS-SecureConversation 性能相比较有何不同 简介:WS-SecureConversation 能让您保证正在进行的 Web 服务消息交换的安全,同时花费比普通 WS-Security 更少的处理开销.在本文中,您将学习如何配置 WS-SecureConversation 并将其用于三个 主要的开源 Java Web 服务栈:Apache Axis2.Metro 和 Apache CXF.还将看到这三个栈的 WS -SecureConversation 性

Java Web服务: CXF性能比较

简介:Apache CXF 与 Apache Axis2 及 Metro 共享一些底层组件,但在完全不同的架构中结合了这 些组合.Dennis Sosnoski 将继续他的 Java Web 服务 专栏,比较 CXF.Metro 和 Axis2 栈在有无 WS -Security 的情况下的性能表现. Apache CXF Web 服务栈建立在与本系列早期文章讨论的 Apache Axis2 及 Metro 栈相同的一些技术 的基础之上.与 Axis2 类似,它使用 Apache WSS4J W

Java Web服务,第3部分: Axis2数据绑定

相关文章: Java Web服务,第1部分: Java Web服务在未来一年内的发展 Java Web服务,第2部分: 深度探索Axis2:AXIOM Apache Axis2 Web 服务框架一开始就设计用于支持多种 XML 数据绑定方法.当前的版本 提供对 XMLBeans 和 JiBX 数据绑定以及专门针对 Axis2 开发的自定义 Axis 数据绑定 (Axis Data Binding,ADB)的全面支持.本文将说明如何将这些不同的数据绑定方法与 Axis2 结合使用,并说明为什么可能

Java Web服务: WS-Trust和WS-SecureConversation

了解 WS-SecureConversation 如何能改善 Web 服务的安全性能 简介:WS-Security 为 SOAP 消息交换添加了企业级的安全特性,但却有大量的性能损失.WS-Trust 构建于 WS-Security 基础上,提供了一种交换安全令牌的方式,WS-SecureConversation 构建于 WS-Security 和 WS-Trust 基础上,改善了进行中的消息交换的性能.Dennis Sosnoski 将继续他的 Java Web 服务 专栏系列,本期文章将介绍

实例jie如何提高Java Web 服务性能优化实践

本文介绍如何提升 Java Web 服务性能,主要介绍了三种方法:一是采用 Web 服务的异步调用,二是引入 Web 服务批处理模式,三是压缩 SOAP 消息.重点介绍在编程过程中如何使用异步 Web 服务以及异步调用和同步调用的差异点.本文还示范了如何在项目中使用以上三种方法,以及各种方法所适合的应用场景. Java Web 服务简介 Web 服务是一种面向服务架构的技术,通过标准的 Web 协议提供服务,目的是保证不同平台的应用服务可以互操作.Web 服务(Web Service)是基于 X

部署Java Web服务

引言 在过去数年里,随着万维网联盟(World Wide Web Consortium,W3C)更新了核心规范,并引入了弥补 Web服务最初缺陷的新规范,Web服务发生了大量的变化.W3C 的Web Services Activity 小组所维护的规范以独立于供应商的方式将 Web服务作为一组 XML 规范进行处理. 同时,Java Community Process (JCP) 也在维护自己的规范集,以将 W3C 的建议合并到 Java 语言中.Java APIs for XML(JAX-RP

Java Web服务,第1部分: Java Web服务在未来一年内的发展

2006 年将是 Web 服务(特别是 Java Web 服务)发展标志性的一年.新的第三代框架即将撩开面纱,这些框架将为 doc/lit SOAP 提供更好的支持,并能带来潜在的性能提高.同时,第四代 WS-* 标准也最终开始形成一组可互操作的层,对 SOAP 和 WSDL 进行扩展,以支持核心企业需求. 这篇文章是我的 Java Web 系列的第 1 部分,我将讨论以下 Web 服务目前的状态和在 2006 年即将发生的主要变化,并将简单说明新框架和技术如何相关和交互.后续文章将深入讨论其中

使用SOAP开发java web服务

web|web服务   本文的预定读者首先要对j2ee有所了解,熟悉xml,tomcat等基本内容,本文主要是简单介绍一下web服务的基本内容,怎样在java web开发中构建SOAP服务: 一.SOAP(Simple Object Access Protocol)简单对象访问协议,要了解SOAP,首先就需要了解分布式计算的由来,随着下一代的分布式计算体系web服务的出现,SOAP成为了创建和调用通过网络发布的应用程序的实际通信标准.SOAP类似传统的二进制协议IIOP(CORBA)和JRMP(

Java Web服务: Metro简介

Metro Web 服务栈是由 Sun Microsystems 开发的一个开源工具.它将 JAXB 2.x 数据绑定和 JAX-WS 2.x Web 服务标准的参考实现与其他与 XML 相关的 Java 标准相结合.Metro 还包括一些附加组件,以 支持基本 JAX-WS 服务的定义和使用以及 SOAP 消息交换的各种 WS-* 扩展. Metro 既可以用作独立的 Web 服务栈,也可以用作开源 Glassfish 应用服务器中的集成组件.如果 使用 Glassfish,尤其是在拥有配置基