Безопасный WS-клиент с UsernameToken (заголовок безопасности SOAP) - PullRequest
1 голос
/ 04 января 2011

Я пытаюсь защитить свой клиент WS, чтобы он мог вызывать WS.
Мой код выглядит так:

            SendSmsService smsService = new SendSmsService();
SendSms sendSMS = smsService.getSendSms();  
BindingProvider stub = (BindingProvider)sendSMS;

//Override endpoint with local copy of wsdl.
String URL ="";//here is the wsdl url
Map<String,Object> requestContext = stub.getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, URL);

//Set usernametoken
URL fileURL = loader.getResource("client-config.xml");
File file = new File(fileURL.getFile());

FileInputStream clientConfig = null;
try {
 clientConfig = new FileInputStream(file);
} catch (FileNotFoundException e) {
 e.printStackTrace();
}

XWSSecurityConfiguration config = null;
try {
 config = SecurityConfigurationFactory.newXWSSecurityConfiguration(clientConfig);
} catch (Exception e) {
 e.printStackTrace();
 log.warn("Exception: "+e.getMessage());
}
requestContext.put(XWSSecurityConfiguration.MESSAGE_SECURITY_CONFIGURATION, config);

//Invoke the web service

 String requestId = null;
 try {
  requestId = sendSMS.sendSms(addresses, senderName, charging, message,   receiptRequest);
 } catch (PolicyException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 } catch (ServiceException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }

, а файл конфигурации выглядит следующим образом:

<xwss:JAXRPCSecurity xmlns:xwss="http://java.sun.com/xml/ns/xwss/config"   optimize="true">
 <xwss:Service>
  <xwss:SecurityConfiguration dumpMessages="true"
   xmlns:xwss="http://java.sun.com/xml/ns/xwss/config">
    <xwss:UsernameToken name="username" password="password>
  </xwss:SecurityConfiguration>
 </xwss:Service>
 <xwss:SecurityEnvironmentHandler>
  util.SecurityEnvironmentHandler
</xwss:SecurityEnvironmentHandler>
</xwss:JAXRPCSecurity>

SecurityEnviromentHandler - это фиктивный класс, который реализует javax.security.auth.callback.CallbackHandler.

Аутентификация должна соответствовать профилю токена имени пользователя Oasis Web Services 1.0.
Но яя постоянно получаю сообщение об ошибке «Заголовок безопасности недействителен».
Куда я иду, может кто-нибудь сказать мне.
Я использовал wsimport (JAX_WS 2.1 для генерации классов для моего клиента)
Примечание: единственное, что я знаюОб этом WS является URL WSDL и user & pass для аутентификации

1 Ответ

4 голосов
/ 17 января 2011

РЕШЕНИЕ
Я решил проблему. Дело в том, что файл client-config.xml был причиной того, что я не знал, как его правильно настроить. Я столкнулся с этим примером и использовал его:
http://www.javadb.com/using-a-message-handler-to-alter-the-soap-header-in-a-web-service-client
Просто скопировали эти 2 класса по ссылке в структуру моих проектов и назвали их примерно так:

SendSmsService smsService = new SendSmsService();
HeaderHandlerResolver handlerResolver = new HeaderHandlerResolver();
smsService.setHandlerResolver(handlerResolver);
SendSms sendSMS = smsService.getSendSms();

Теперь все работает отлично!

...