第 5 章 WS-Policy 框架
摘要
本章介绍了 WS-Policy 框架的基本概念,定义策略主题和策略断言,并阐述如何组合策略断言来制定策略表达式。
5.1. WS-Policy 简介
概述
WS-Policy 规范 提供了一个通用框架,用于应用策略,修改 Web 服务应用中在运行时连接和通信的语义。Apache CXF 安全性使用 WS-Policy 框架配置消息保护和身份验证要求。
策略和策略参考
指定策略的最简单方法是直接嵌入要应用策略的位置。例如,要将策略与 WSDL 合同中的特定端口关联,您可以按照如下所示指定它:
<wsdl:definitions targetNamespace="http://tempuri.org/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
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" ... >
...
<wsdl:service name="PingService10">
<wsdl:port name="UserNameOverTransport_IPingService" binding="BindingName">
<wsp:Policy> <!-- Policy expression comes here! --> </wsp:Policy>
<soap:address location="SOAPAddress"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
指定策略的一种替代方法是在要应用策略时插入策略参考元素 wsp:PolicyReference,然后在 XML 文件中的某个其他点插入策略元素 wsp:Policy。例如,要使用策略引用将策略与特定端口关联,您可以使用类似如下的配置:
<wsdl:definitions targetNamespace="http://tempuri.org/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
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" ... >
...
<wsdl:service name="PingService10">
<wsdl:port name="UserNameOverTransport_IPingService" binding="BindingName">
<wsp:PolicyReference URI="#PolicyID"/>
<soap:address location="SOAPAddress"/>
</wsdl:port>
</wsdl:service>
...
<wsp:Policy wsu:Id="PolicyID">
<!-- Policy expression comes here ... -->
</wsp:Policy>
</wsdl:definitions>
当策略引用时,wsp:PolicyReference 使用 ID, PolicyID 查找引用的策略(请注意 URI 属性中添加 # 前缀字符)。策略本身 wsp:Policy 必须通过添加属性 wsu:Id="PolicyID" 来识别。
策略主题
与策略关联的实体被称为 策略主题。例如,您可以将策略与端点关联,在这种情况下,端点 为策略主题。可以将多个策略与任何给定策略主题相关联。WS-Policy 框架支持以下策略主题:
服务策略主题
要将策略与服务关联,请插入 < wsp:Policy> 元素或 <wsp:PolicyReference > 元素作为以下 WSDL 1.1 元素的子元素:
-
WSDL:service- 将策略应用到该服务提供的所有端口(端点)。
端点策略主题
要将策略与端点关联,请插入 < ;wsp:Policy& gt; 元素或 < wsp:PolicyReference > 元素作为以下 WSDL 1.1 元素的子元素:
-
WSDL:portType- 将策略应用到使用此端口类型的所有端口(端点)。 -
WSDL:binding- 将策略应用到使用此绑定的所有端口。 -
WSDL:port- 仅应用此端点的策略。
例如,您可以将策略与端点绑定关联,如下所示(使用策略参考):
<wsdl:definitions targetNamespace="http://tempuri.org/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
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" ... >
...
<wsdl:binding name="EndpointBinding" type="i0:IPingService">
<wsp:PolicyReference URI="#PolicyID"/>
...
</wsdl:binding>
...
<wsp:Policy wsu:Id="PolicyID"> ... </wsp:Policy>
...
</wsdl:definitions>操作策略主题
要将策略与操作关联,请插入 < ;wsp:Policy& gt; 元素或 < wsp:PolicyReference > 元素作为以下任何 WSDL 1.1 元素的子元素:
-
WSDL:portType/wsdl:operation -
WSDL:binding/wsdl:operation
例如,您可以将策略与绑定中的操作关联(使用策略引用):
<wsdl:definitions targetNamespace="http://tempuri.org/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
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" ... >
...
<wsdl:binding name="EndpointBinding" type="i0:IPingService">
<wsdl:operation name="Ping">
<wsp:PolicyReference URI="#PolicyID"/>
<soap:operation soapAction="http://xmlsoap.org/Ping" style="document"/>
<wsdl:input name="PingRequest"> ... </wsdl:input>
<wsdl:output name="PingResponse"> ... </wsdl:output>
</wsdl:operation>
...
</wsdl:binding>
...
<wsp:Policy wsu:Id="PolicyID"> ... </wsp:Policy>
...
</wsdl:definitions>消息策略主题
要将策略与消息关联,请插入 < ;wsp:Policy& gt; 元素或 < wsp:PolicyReference > 元素作为以下任何 WSDL 1.1 元素的子元素:
-
WSDL:message -
WSDL:portType/wsdl:operation/wsdl:input -
WSDL:portType/wsdl:operation/wsdl:output -
WSDL:portType/wsdl:operation/wsdl:fault -
WSDL:binding/wsdl:operation/wsdl:input -
wsdl:binding/wsdl:operation/wsdl:output -
WSDL:binding/wsdl:operation/wsdl:fault
例如,您可以将策略与绑定中的消息相关联(使用策略引用):
<wsdl:definitions targetNamespace="http://tempuri.org/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
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" ... >
...
<wsdl:binding name="EndpointBinding" type="i0:IPingService">
<wsdl:operation name="Ping">
<soap:operation soapAction="http://xmlsoap.org/Ping" style="document"/>
<wsdl:input name="PingRequest">
<wsp:PolicyReference URI="#PolicyID"/>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="PingResponse"> ... </wsdl:output>
</wsdl:operation>
...
</wsdl:binding>
...
<wsp:Policy wsu:Id="PolicyID"> ... </wsp:Policy>
...
</wsdl:definitions>