2

我们正在实现一个 Web 服务,它将充当客户端和另一个应用程序之间的中间层。我们对 Web 服务的要求是,我们需要使用标准 WS-Security 在 SOAP 标头中发送用户名和密码。

Web 服务实现需要获取通过方法调用传入的信息,并将其与用户名和密码结合起来才能调用其他应用程序,这就是我的问题开始的地方。

我想不出一种简单的方法来从我的 Web 服务实现中的 SOAP 标头获取用户名和密码。我可以通过注入的 WebServiceContext 访问用户主体(用户名),但我没有看到任何简单的方法来获取密码。

我可以访问 SOAPHeader 并可能解析 XML 以获取密码元素,但这似乎是解决此问题的一种非常混乱的方法。

我对 JAX-WS 和 WS-Security 的了解并不如我所愿。我希望我错过了对其他人来说显而易见的东西——也许我需要实现某种处理程序?

4

1 回答 1

2

最简单的方法是从 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>
于 2010-05-13T18:28:02.847 回答