技术开发 频道

Java Web 服务: Axis2 WS-Security 基础

  尝试使用 WS-Security

  WS-Security 定义了一些不同的安全令牌类型(包括构成核心规范的令牌以及在配置文件 中定义为规范的插件扩展的令牌),并定义了多种方法来构建和使用令牌。本文的目的就是使用 Axis2 配置和 Rampart,因此我将使用最简单的令牌作为示例:由 UsernameToken 配置文件定义的 UsernameToken。

  UsernameToken WS-SecurityPolicy

  UsernameToken 的功能仅仅是将用户名和密码信息作为 WS-Security 头部的一部分进行传递。UsernameToken 的最基本形式就是以明文的方式发送用户名和密码。从安全角度来看这并不合适(但是在安全连接之上使用这种方法并不会出问题),但是很容易看到发送的内容,因此是一个非常好的起点。

  将 UsernameToken 以文本形式发送的 WS-SecurityPolicy 配置非常简单,如 清单 3 所示。该策略(在这里将一行代码显示为两行以匹配页面宽度 — 实际使用时这样做是无效的)包含了一个标准 WS-Policy 包装器(使用 wsp 前缀的元素),用来封装一个 WS-SecurityPolicy UsernameToken 断言。

  清单 3. 用于明文形式的 UsernameToken 的 WS-SecurityPolicy

<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="http://docs.oasis-open.org/
               ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient"/>
        </wsp:Policy>
      
</sp:SupportingTokens>
    
</wsp:All>
  
</wsp:ExactlyOne>
</wsp:Policy>

  清单 3 中的 UsernameToken 使用一个 IncludeToken 属性指定将包含到令牌中的消息流的类型 — 在本例中,所有消息流从请求发起者(即客户机)流向请求接收者(即服务器)。还可以为 IncludeToken 属性定义其他值来指定不同的令牌用途,但是对于 UsernameToken,这通常是惟一有效的值。

  应用策略

  WS-Policy 和 WS-SecurityPolicy 旨在支持 WSDL 服务定义中的内嵌功能。使用引用将一个策略关联到一个或多个 /定义。Axis2 1.4.X 为 WSDL 中内嵌的策略实现了初步处理,但是直到 Axis2 1.4.1,实现仍然不够健壮。本文将把策略直接连接到客户机和服务器,从而实现与 1.4.1 代码的兼容性。

  服务器端策略处理

  在服务器端,应用策略的方式是将其添加到每个 Axis2 .aar 服务归档中的 services.xml 配置文件。策略可以作为 元素的子元素直接添加,以应用于服务定义的所有操作。还需要向 services.xml 添加一个 元素,这是为了告诉 Axis2 Rampart 模块必须包含在服务的配置中。清单 4 是示例应用程序使用的经过编辑的 services.xml,其中粗体显示的是添加的模块引用和策略信息:

  清单 4. 包含内嵌策略的 services.xml

<serviceGroup>
  
<service name="library-username">
    
<messageReceivers>
      
<messageReceiver
          class
="com.sosnoski.ws.library.adb.LibraryUsernameMessageReceiverInOut"
          mep
="http://www.w3.org/ns/wsdl/in-out"/>
    
</messageReceivers>
    
<parameter
        name
="ServiceClass">com.sosnoski.ws.library.adb.LibraryUsernameImpl</parameter>
    
<parameter name="useOriginalwsdl">true</parameter>
    
<parameter name="modifyUserWSDLPortAddress">true</parameter>
    
<operation mep="http://www.w3.org/ns/wsdl/in-out" name="getBook"
        namespace
="http://ws.sosnoski.com/library/wsdl">
      
<actionMapping>urn:getBook</actionMapping>
      
<outputActionMapping>http://.../getBookResponse</outputActionMapping>
    
</operation>
    ...

    
<module ref="rampart"/>
    
<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
        xmlns:wsu
="http://.../oasis-200401-wss-wssecurity-utility-1.0.xsd"
        wsu:Id
="UsernameToken">
      
<wsp:ExactlyOne>
        
<wsp:All>
          
<sp:SupportingTokens
              xmlns:sp
="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
            
<wsp:Policy>
              
<sp:UsernameToken
                  sp:IncludeToken
="http://.../IncludeToken/AlwaysToRecipient">
                
<wsp:Policy>
                  
<sp:HashPassword/>
                
</wsp:Policy>
              
</sp:UsernameToken>
            
</wsp:Policy>
          
</sp:SupportingTokens>

          
<ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy">
            
<ramp:passwordCallbackClass>...PWCBHandler</ramp:passwordCallbackClass>
          
</ramp:RampartConfig>

        
</wsp:All>
      
</wsp:ExactlyOne>
    
</wsp:Policy>
  
</service>
</serviceGroup>
0
相关文章