WSDL, созданный в CXF, не содержит определения WS-SecurityPolicy - PullRequest
2 голосов
/ 26 июля 2011

Я бы хотел использовать WS-Security для защиты своего веб-сервиса.Я использую CXF для предоставления своей конечной точки и использую генерацию WSDL из кода Java (он же служба CXF code first).

В этом руководстве объясняется, как использовать WS-Security с CXF, когда WSDL управляется вручную: http://www.ibm.com/developerworks/java/library/j-jws13/index.html

Однако я использую CXF для автоматической генерации WSDL. Сгенерированный WSDL не указывает, что клиент должен использовать WS-Security. Я ожидал бы что-то подобное в WSDL:

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

Я не использую Spring, ноЯ использую встроенный Jetty.Вот как я подключаю все:

CXFNonSpringServlet cxfServlet = new CXFNonSpringServlet() {
  private static final long serialVersionUID = 1L;

  @Override
  protected void loadBus(ServletConfig sc) {
    super.loadBus(sc);

    Map<String, Object> inProps = new HashMap<String, Object>();
    inProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
    inProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
    inProps.put(WSHandlerConstants.PW_CALLBACK_REF, new TestCallback());

    JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
    factory.setBus(bus);
    factory.setServiceBean(new MyServiceEndpointImpl());
    factory.setAddress("/myservice");
    factory.getInInterceptors().add(new WSS4JInInterceptor(inProps));
    factory.create();
  }
};

Server server = new Server(8080);
ContextHandlerCollection contexts = new ContextHandlerCollection();
server.setHandler(contexts);
ServletContextHandler rootContext = new ServletContextHandler(contexts, "/");
rootContext.addServlet(new ServletHolder(cxfServlet), "/soap/*");
server.start();

1 Ответ

2 голосов
/ 27 июля 2011

Сейчас это не поддерживается.

Примечание: на данный момент поддержка WS-SecurityPolicy доступна ТОЛЬКО для сценариев "сначала WSDL".Фрагменты WS-SecurityPolicy можно извлечь только из WSDL.В будущем мы планируем также включить различные сценарии с первым кодом, но в настоящее время доступен только WSDL.

http://cxf.apache.org/docs/ws-securitypolicy.html

Кто-то объясняет ту же проблему здесьи выставить решение с помощью @Policy.Тем не менее, решение является заболоченным с CXF <= 2.4.1 (политика добавляется дважды в WSDL). </p>

http://cxf.547215.n5.nabble.com/WS-Security-policy-in-wsdl-for-java-first-approach-td569052.html

Проблема дублирования теперь исправлена ​​и будет выпущена в2.4.2 (см. https://issues.apache.org/jira/browse/CXF-3668)

...