Доступ к имени пользователя / паролю из веб-службы (JAX-WS)?

Мы реализуем веб-сервис, который будет действовать как промежуточный уровень между клиентами и другим приложением. Наши требования к веб-сервису гласят, что нам нужно отправить имя пользователя и пароль в заголовке SOAP, используя стандартный WS-Security.

Реализация веб-службы должна взять информацию, переданную через вызов метода, и объединить ее с именем пользователя и паролем, чтобы вызвать другое приложение, и именно здесь начинается моя проблема.

Я не могу найти простой способ получить имя пользователя и пароль из заголовка SOAP в моей реализации веб-службы. Я могу получить доступ к основному пользователю (имени пользователя) через введенный WebServiceContext, но я не вижу простого способа получить пароль.

Я могу добраться до SOAPHeader и, вероятно, мог бы проанализировать XML, чтобы получить элемент пароля, но это кажется очень беспорядочным способом решения этой проблемы.

Я не так хорошо разбираюсь в JAX-WS и WS-Security, как хотелось бы. Я надеюсь, что мне не хватает чего-то очевидного для кого-то другого - может быть, мне нужно реализовать какой-то обработчик?


person Chad    schedule 13.05.2010    source источник


Ответы (1)


Самый простой подход - извлечь имя пользователя и пароль из заголовка SOAP, указав его в качестве параметра для вашего метода JAX-WS:

@WebMethod
public String performAction( @WebParam(name="credentials", header=true)
                             Credentials credentials,
                             @WebParam( name="...")....

Вы также можете создать SOAPHandler:

public class AuthenticationHandler implements SOAPHandler<SOAPMessageContext>
{
    //Implement appropriate methods here
}

Это зарегистрировано в standard-jaxws-endpoint-config.xml:

<jaxws-config xmlns="urn:jboss:jaxws-config:2.0" 
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
              xmlns:javaee="http://java.sun.com/xml/ns/javaee"
              xsi:schemaLocation="urn:jboss:jaxws-config:2.0 jaxws-config_2_0.xsd">
   <endpoint-config>
      <config-name>WebService Endpoint</config-name>
      <pre-handler-chains>
         <javaee:handler-chain>
            <javaee:protocol-bindings>##SOAP11_HTTP</javaee:protocol-bindings>
            <javaee:handler>
                <javaee:handler-name>AuthHandler</javaee:handler-name>
                <javaee:handler-class>com.example.AuthenticationHandler</javaee:handler-class>
            </javaee:handler>
         </javaee:handler-chain>
      </pre-handler-chains>
   </endpoint-config>
</jaxws-config>
person mtpettyp    schedule 13.05.2010
comment
Это похоже на то, что я ищу. Если я добавлю параметр в свой метод службы с флагом header = true, заставит ли это клиентов, использующих веб-службу, изменить свою реализацию, или параметр отображается из заголовка без необходимости что-либо делать клиенту? - person Chad; 23.05.2010