1

我需要访问安全的网络服务。我需要在soap请求中传递安全标头。请帮助我在java中提供自定义安全标头代码。

要求:

   <soapenv:Header>

 <wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/07/secext">

  <wsse:UsernameToken xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility">
    <wsse:Username>XYZ</wsse:Username>
    <wsse:Password Type="wsse:PasswordText">security</wsse:Password>
  </wsse:UsernameToken>

如果有人在这方面帮助我,我将不胜感激。

4

3 回答 3

3

似乎很清楚您要添加 UsernameToken 安全标头。至少有几种不同的方法可以做到这一点。如果您有一个包含 WS-SecurityPolicy 组件的 WSDL 服务定义,您只需设置适当的属性来定义用户名和密码值,如本文所示

如果您想直接设置(不使用策略),您可以在客户端代码中执行此操作。这是一个如何工作的示例:`

    // create the client stub
    MyService service = new MyService();
    MyServicePort stub = service.getMyServicePort();

    // configure UsernameToken security handling
    Map<String, Object> props = new HashMap<String, Object>();
    props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
    props.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
    props.put(WSHandlerConstants.USER, "XYZ");
    props.put(WSHandlerConstants.PW_CALLBACK_CLASS, PasswordHandler.class.getName());
    WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(props);
    Client client = ClientProxy.getClient(stub);
    client.getOutInterceptors().add(wssOut);

...

/**
 * Callback for password used by WS-Security UsernameToken.
 */
public static class PasswordHandler implements CallbackHandler
{
    public void handle(Callback[] callbacks) {
        for (int i = 0; i < callbacks.length; i++) {
            WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];
            pc.setPassword("security");
        }
    }
}

`

于 2013-09-15T06:54:02.273 回答
2

感谢您的支持。我将以下代码用于安全标头,它对我来说工作正常。

SOAPHeaderElement wsseSecurity = new SOAPHeaderElement(new PrefixedQName("http://schemas.xmlsoap.org/ws/2002/07/secext","Security", "wsse"));
            wsseSecurity.setMustUnderstand(false);
            wsseSecurity.setActor(null);
            SOAPElement sub = wsseSecurity.addChildElement("UsernameToken");
            sub.setAttribute("xmlns:wsu", "http://schemas.xmlsoap.org/ws/2002/07/utility");
            SOAPElement userElement = sub.addChildElement("Username");
            userElement.addTextNode("XYZ");         
            SOAPElement pwdElement = sub.addChildElement("Password");
            pwdElement.setAttribute("Type", "wsse:PasswordText");
            pwdElement.addTextNode("security");
            _stub.setHeader(wsseSecurity);    
于 2013-09-16T14:11:54.253 回答
1

你的问题不清楚!
看看文章这个话题
顺便说一句
,如果您的意思是在 HTTPS 等传输级协议上具有安全性,您可能会看到Apache CXF SSl 支持
如果您的意思是 WS-Security 超出传输级别协议,例如 XML-Encryption 或 X509,您可能会看到Apache CXF WS-Security

于 2013-09-14T07:15:55.627 回答