当前位置: 首页 > 工具软件 > WS-Policy > 使用案例 >

WS-Policy学习笔记

东方镜
2023-12-01

http://dev2dev.bea.com.cn/blog/woohoo/200710/18_470.html

WS-Policy解决的问题

我们知道在SOA架构中,最重要的基石就是Service,而业务上对于服务约束来自于业务的Contract,那么我们如何在服务的实现过程中体现相应的contract约束呢?

对于SOA规范中标准化的Web Service来讲,体现这些约束的标准就是WS-Policy,而其他的规范像WS-AddressingWS-RMWS-Security都可以看做WS-Policy的特例。

另外在SOA的实践中提出的新的Service Governance的概念,Service Governance中就包含了对Policy的管理。Policy的管理包含两个部分内容:一是要在设计和运行时规定服务策略(Service Policy)的定义,交换和强制执行的方式和方法;二是要有基于标准(比如 WS-*)和组织内部规章。那么我就可以看到WS-PolicySOA项目实施过程中,或者说在SOA的管控(governance)领域实际的应用意义。

WS-Policy相对于WS-Addressing要稍微复杂一些。除了配置的工作外,如果开发者要实现自己特定的Policy,还需要实现某些Inteceptor接口来完成指定的操作。

WS-Policy中重要的概念

断言(Assertion

它是策略(Policy)的基本组成单元,每个断言可以通过它们的限定名 ( QName) 来识别。断言可以是一个简单的字符串或带多个子元素和属性的复杂对象。断言是要表示服务行为的个性化要求、能力或其他特性。例如,可以创建一个断言,定义这样一个安全要求:必须使用受信任的X.509证书签名SOAP消息主体。

替代(Alternative

替代只是对于断言的另外形式的表现,或者说是断言的组合形式。

标准化(Normalization

标准化的目的是为了进行融合(Merge)和交集(Intersection)的操作,把策略简化为标准格式。

融合(Merge

融合是将多个子策略组合在一起形成一个单一策略的过程。

交集(Intersection

交集是比较用于公用替代的 2 Web 服务策略的过程。只有双方至少对一个策略替代达成一致,才会产生交集。

WS-Policy的应用

Weblogic

Weblogic中也提供了对WS-Policy的支持,支持需要程序员在开发时使用@policy声明来关联WS-Policy使用的文件,管理员不能通过控制台的配置来关联WS-Policy使用的文件,但是可以关联其他与WS-Policy相关的文件。

Weblogic 10 中对于WS-Policy配置的文档:

http://e-docs.bea.com/wls/docs100/ConsoleHelp/taskhelp/webservices/ConfigureWSPolicyFile.html

CXF

WeblogicWS-Policy支持相对于CXF开源框架来说,还不够完整和全面。CXFWS-Policy框架提供了一个允许CXF用户和开发者使用WS-policy应用架构和APICXF支持规范的版本是1.5。框架是由一个核心运行环境(Core和允许开发人员插入自己定义的断言的API组成的。

核心运行环境(Core

从不同源文件(WSDL,外部文档)中获取Polices信息

对实施的Policy(策略)的服务,端点,操作和消息对象的计算

通过拦截器对某个特定的Message实施的策略的运行状态的监管

对于一个替代的实施策略的支持性验证

CXF中对策略的操作,比如融合(Merge)和标准化,是基于Apache Neethi完成的。

API包含两大类型的接口:AssertionBuilderPolicyInterceptorProvider

AssertionBuilder

AssertionBuilder的概念来源于Neethi,为了不依赖于AXIS对象模型,它做了一些简单的改变,并扩展了一些对域定义的特定的比较操作和交集操作的支持。

AssertionBuilder的实现会动态的加载并自动的注册在AsserionBuilderRegistry的注册表中,这个注册表是Bus的扩展。目前,CXF支持如下的AssertionBuilderAssertion实现:

{http://schemas.xmlsoap.org/ws/2005/02/rm/policy}RMAssertion

{http://www.w3.org/2007/01/addressing/metadata}Addressing

{http://www.w3.org/2007/01/addressing/metadata}AnonymousResponses

{http://www.w3.org/2007/01/addressing/metadata}NonAnonymousResponses

{http://cxf.apache.org/transports/http/configuration}client

{http://cxf.apache.org/transports/http/configuration}server

以上的类型都基于通用的Assertion的实现(PrimitiveAssertion, NestedPrimitiveAssertion, JaxbAssertion) ),开发者可以参数化或者扩展他们自己的Assertion

PolicyInterceptorProvider

这个API用来自动的在运行环境下使拦截器按照要求支持域定义的断言,借此可以很好的简化拦截器的配置。

public interface PolicyInterceptorProvider extends InterceptorProvider {
  // returnthe schema types of the asssertions that can be supported
  Collection<QName> getAssertionTypes()
}

目前,CXF支持PolicyInterceptorProvider实现下列类型的断言

{http://schemas.xmlsoap.org/ws/2005/02/rm/policy}RMAssertion
{http://www.w3.org/2007/01/addressing/metadata}Addressing
{http://www.w3.org/2007/01/addressing/metadata}AnonymousResponses
{http://www.w3.org/2007/01/addressing/metadata}NonAnonymousResponses

另外CXF框架提供了一个在Policy附件中改进域表达式(在策略范围内描述策略主题的xml elements

CXFWS-Policy的例子

安装完CXF,在cxf目录下有个samples/ws-Policy的目录,按照readme.txt指导编译执行就可以了。CXF配置WS-Policy是比较简单的,下面是配置文件设计Policy的段落:

……

<cxf:bus>

<cxf:features>

<p:policies/>

</cxf:features>

</cxf:bus>

<p:externalAttachment location="addr-external.xml"/>

……

PolicyAttachment文件addr-external.xml中定义了如下内容:

<attachments xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsa="http://www.w3.org/2005/08/addressing">

<wsp:PolicyAttachment>

<wsp:AppliesTo>

<wsa:EndpointReference>

<wsa:Address>http://localhost:9000/SoapContext/SoapPort</wsa:Address>

</wsa:EndpointReference>

</wsp:AppliesTo>

<wsp:Policy>

<wsam:Addressing xmlns:wsam="http://www.w3.org/2007/02/addressing/metadata">

<wsp:Policy/>

</wsam:Addressing>

</wsp:Policy>

</wsp:PolicyAttachment>

</attachments>

需要注意的是CXF的例子中并没有提供开发WS-Policy API的例子。这也是开源工具的缺憾之一吧。

在有兴趣专研的朋友,也可以看看CXF的源代码研究一下,加深对WS-Policy的理解。

参考文档:http://www.ibm.com/developerworks/cn/webservices/ws-policy.html

 类似资料: