尝试使用 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
"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 .aar 服务归档中的 services.xml 配置文件。策略可以作为
清单 4. 包含内嵌策略的 services.xml
<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>