Если вы используете политики в WS-SecurityPolicy (1.1 или более поздней версии) в своем wsdl, вам не нужно ни создавать политики, ни создавать их на стороне клиента с помощью Apache CXF.С WS-SecurityPolicy среда выполнения безопасности CXF определяется политикой.
1) Вы используете WSDL-первый подход CXF для генерации клиентского кода, используя либо инструмент командной строки wsdl2java
, либо Maven cxf-codegen-plugin
(цель wsdl2java).Это описано в документе CXF Как разработать клиент .
2) Следуя документу CXF при WS-SecurityPolicy , вы настраиваетесвойства безопасности клиента для порта wsdl, который вы хотите использовать, используя JAX-WS API (на клиенте RequestContext
) или конфигурацию Spring XML.Для списка возможных свойств есть общие XML security и WS-Security * .Пример с использованием Spring XML для политики UsernameToken (из примеров блога Глена Маззы ):
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<jaxws:client name="{http://www.example.org/contract/DoubleIt}DoubleItPort" createdFromAPI="true">
<!-- Use this for the UsernameToken Symmetric Binding w/X.509 for secret key derivation -->
<jaxws:properties>
<entry key="ws-security.username" value="alice"/>
<entry key="ws-security.callback-handler" value="client.ClientPasswordCallback"/>
<entry key="ws-security.encryption.properties" value="clientKeystore.properties"/>
<entry key="ws-security.encryption.username" value="myservicekey"/>
</jaxws:properties>
<!-- Use this for the UsernameToken Symmetric Binding w/UT password for secret key derivation -->
<!--jaxws:properties>
<entry key="ws-security.username" value="alice"/>
<entry key="ws-security.callback-handler" value="client.ClientPasswordCallback"/>
</jaxws:properties-->
</jaxws:client>
</beans>
Поместите это в /cxf.xml
на пути к классам.Предупреждение: в примере используется подкласс CallbackHandler
( client.ClientPasswordCallback в этом примере) для предоставления пароля.Так что вам нужно будет предоставить собственную реализацию.
3) Вернуться к документу CXF Как разработать клиент - последняя часть - в коде приложения, инициализировать клиент с помощью API JAX-WS с аргументами: a) расположение WSDL (URL) с политиками WS-SecurityPolicy (насколько я понимаю, у вас уже есть);b) QNames службы и порта, которые будут использоваться клиентом, как определено в WSDL:
final Service service = Service.create(wsdlLocation, SERVICE_QNAME);
final DoubleItPortType transportPort = service.getPort(PORT_QNAME, DoubleItPortType.class);
4) Убедитесь, что у вас есть cxf-rt-ws-policy
и cxf-rt-ws-security
модулей в пути к классам во время выполнения, чтобы включить WS-БезопасностьПолитическая поддержка.