Заголовки безопасности cxf для клиента, использующего java

Мое требование состоит в том, чтобы реализовать метод для создания заголовков безопасности ws с использованием входящего имени пользователя, пароля.

Таким образом, кто-то может вызвать мой метод из xslt, указав имя пользователя и пароль, и мой метод должен иметь возможность возвращать заголовки безопасности, и, кроме того, они могут добавлять эти заголовки безопасности в запрос мыла для вызова стороннего веб-сервиса.

Я ищу API, который может генерировать заголовки безопасности мыла, взяв имя пользователя и пароль.

я нашел WSS4JOutInterceptor, которому нужна информация о порте и сервисе, но в моем случае у меня есть только 2 параметра (имя пользователя, пароль).

пожалуйста, предложите какой-либо другой API / подход, кроме создания SoapEnvelop и добавления к нему элементов безопасности?

<oas:Security xmlns:oas="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">     <oas:UsernameToken xmlns:oas1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" oas1:Id="UsernameToken-1">      <oas:Username> lakshmi </oas:Username><oas:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">MTQ2NzA5NTg3MjM5Mw==</oas:Nonce>       <oas:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">uSlFkVhDynZoCXFojlM1w4UrJYY=</oas:Password><oas1:Created>2016-06-28T06:37:52.425Z</oas1:Created></oas:UsernameToken></oas:Security>

person lkreddy1231    schedule 28.06.2016    source источник
comment
В чем причина создания вашего запроса с помощью xslt при использовании cxf? Каким должен быть результат вашего метода? XML-строка? Пожалуйста, добавьте больше информации, что вам именно нужно.   -  person Frank    schedule 29.06.2016
comment
@ Фрэнк, ты Райт. вывод моего метода должен быть xmlString. В нашем проекте мы преобразовываем входящий запрос (XML) в формат мыла только через xslt. Возможно, я неправильно передал сообщение, мы не используем CXF для преобразования входящего XML в формат SOAP. Текущее требование состоит в том, чтобы создать заголовок безопасности, взяв имя пользователя и пароль.   -  person lkreddy1231    schedule 29.06.2016
comment
Поэтому вам нужно сгенерировать заголовок soap для исходящих соединений и не беспокоиться о том, как генерируется тело: xslt и т. Д. Не так ли? Вероятно, вам не нужен CXF. Пожалуйста, добавьте пример желаемого формата заголовка, если вы знаете, или, по крайней мере, ограничения двоичного токена безопасности, установленные вашим сервером.   -  person pedrofb    schedule 29.06.2016
comment
@pedrofb это именно то, что я ищу. Тело мыла и другая часть заголовков обрабатывается XSLT. Я отредактировал объявление вопроса, добавив ожидаемый формат заголовка. пожалуйста, посмотрите. (я понятия не имел, как связать файл, поэтому я добавил к вопросу). в настоящее время мы жестко кодируем все заголовки и создаем дайджест пароля, одноразовый номер и т. д., используя формат кодирования Base64, добавляем к заголовкам безопасности и возвращаем эту строку обратно. этот материал, который я хочу создать, используя некоторые API.   -  person lkreddy1231    schedule 30.06.2016
comment
Привет @ lkredy1231, ты проверил ответ?   -  person pedrofb    schedule 05.07.2016
comment
@pedrofb извините за задержку с ответом. Я думаю, ваше предложение решит мою проблему. Вы сэкономили много времени.   -  person lkreddy1231    schedule 12.07.2016


Ответы (1)


Вы можете использовать WSS4J для создания заголовка безопасности.

 public Node buildSecurityHeader(String username, String password) 
        throws WSSecurityException, ParserConfigurationException, SAXException, IOException{

    //XML Document builder with a root node
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    InputSource inStream = new InputSource();
    inStream.setCharacterStream(new StringReader("<root></root>"));
    Document document = builder.parse(inStream);

    //<wsse:UsernameToken>
    WSSecUsernameToken usernametoken = new WSSecUsernameToken();
    usernametoken.setPasswordType(WSConstants.PASSWORD_DIGEST);
    usernametoken.setUserInfo(username, password);

    //<wsse:Security>
    WSSecHeader secHeader = new WSSecHeader(document);
    secHeader.insertSecurityHeader();

    //Generates the Document with <root><Header><wsse:Security>...
    usernametoken.build(document, secHeader);

    //Extract the desired node
    Node securityNode = document.getElementsByTagName("wsse:Security").item(0);

    return securityNode;

}

Чтобы напечатать узел как строку, используйте это

public String nodeToString(Node node) throws TransformerFactoryConfigurationError, TransformerException {
    StringWriter sw = new StringWriter();

    Transformer t = TransformerFactory.newInstance().newTransformer();
    t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
    t.setOutputProperty(OutputKeys.INDENT, "yes");
    t.transform(new DOMSource(node), new StreamResult(sw));
    return sw.toString();
}

И использовать его таким образом

 String securityHeader = nodeToString(buildSecurityHeader(username,password));

Результат будет похож на этот. Параметризируйте код WSSecUsernameToken и WSSecHeader по своему усмотрению.

<wsse:Security xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soapenv:mustUnderstand="1">
    <wsse:UsernameToken wsu:Id="UsernameToken-39dba965-c4a8-4b2d-826e-ade8c0931f3f">
       <wsse:Username>username</wsse:Username>
       <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">BxJH0G5PzPfBFbBGimF0bq3vjsY=</wsse:Password>
       <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">iaO1xilL6qfuN2apbSdfPQ==</wsse:Nonce>
       <wsu:Created>2016-06-30T07:17:26.552Z</wsu:Created>
    </wsse:UsernameToken>
</wsse:Security>
person pedrofb    schedule 30.06.2016