簡體   English   中英

如何驗證基於 soap 的 java web 服務?

[英]How to authenticate soap based java web services?

我正在使用 Java 開發基於 Soap 的 web 服務。 誰能告訴我如何驗證正在使用 web 服務的客戶端?

謝謝。

我們可以實現的不同方式和不同類型的安全性:消息級安全性

  • 傳輸級安全:例如 HTTP Basic/Digest 和 SSL
  • Message level security : Such as WS-Security, XML digital signature, XML Encryption,XKMS ( X ML K ey M anagement S pecification), XACML (e X tensible A ccess C ontrol M arkup L anguage), SAML ( S ecure A ssertion標記語言), ebXML消息服務,自由聯盟項目。 了解更多詳情
  • 訪問控制安全:安全角色是根據特定條件授予用戶或組的特權。

最常見的是,我們將 WS-Security 用於 SOAP Web 服務。 WS-security 概要文件確定如何啟用 WS-security。

  1. WSS X.509 令牌配置文件:將 X.509 框架用於 WSS X.509 安全配置文件。
  2. WSS UsernameToken Profile :指定 X.509 令牌配置文件時,您還可以在 SOAP 請求中提供 UsernameToken。

例子:

<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-6138db82-5a4c-4bf7-915f-af7a10d9ae96">
  <wsse:Username>user</wsse:Username>
  <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">CBb7a2itQDgxVkqYnFtggUxtuqk=</wsse:Password>
  <wsse:Nonce>5ABcqPZWb6ImI2E6tob8MQ==</wsse:Nonce>
  <wsu:Created>2010-06-08T07:26:50Z</wsu:Created>
</wsse:UsernameToken>

上述元素包含在 SOAP header 中,如下所示:

SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
    SOAPHeader header = envelope.addHeader();
    SOAPElement security = header.addChildElement("Security", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
    SOAPElement usernameToken = security.addChildElement("UsernameToken", "wsse");
    SOAPElement username = usernameToken.addChildElement("Username", "wsse");
    username.addTextNode(user);

    SOAPElement password = usernameToken.addChildElement("Password", "wsse");
    password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest");
    password.addTextNode(encodedPass); //encodedPass = Base64 ( SHA-1 ( nonce + created + password ) )

    SOAPElement nonce =
        usernameToken.addChildElement("Nonce", "wsse");
    nonce.addTextNode(Base64.encodeBytes(nonceString.getBytes()));

    SOAPElement created = usernameToken.addChildElement("Created", "wsu","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");

    created.addTextNode(creatTime);

以下示例僅將用戶和密碼簡單地添加到 HTTP header。

使用WebServiceContext接口的 JAX-WS 應用程序身份驗證

WebServiceImpl.java

package com.javacodegeeks.enterprise.ws;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.jws.WebService;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;

@WebService(endpointInterface = "com.javacodegeeks.enterprise.ws.WebServiceInterface")
public class WebServiceImpl implements WebServiceInterface {

    @Resource
    WebServiceContext webServiceContext;

    @Override
    public String getHelloWorldAsString(String str) {

        MessageContext messageContext = webServiceContext.getMessageContext();

        // get request headers
        Map<?,?> requestHeaders = (Map<?,?>) messageContext.get(MessageContext.HTTP_REQUEST_HEADERS);
        List<?> usernameList = (List<?>) requestHeaders.get("username");
        List<?> passwordList = (List<?>) requestHeaders.get("password");

        String username = "";
        String password = "";

        if (usernameList != null) {
            username = usernameList.get(0).toString();
        }

        if (passwordList != null) {
            password = passwordList.get(0).toString();
        }

                // of course this is not real validation
                // you should validate your users from stored databases credentials
        if (username.equals("nikos") && password.equals("superpassword")) {

            return "Valid User :"+str;

        } else {

            return "Unknown User!";
        }
    }
}

WebServiceClient.java

package com.javacodegeeks.enterprise.ws.client;

import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Service;
import javax.xml.ws.handler.MessageContext;
import com.javacodegeeks.enterprise.ws.WebServiceInterface;

public class WebServiceClient{

    public static void main(String[] args) throws Exception {

        URL wsdlUrl = new URL("http://localhost:8888/webservice/helloworld?wsdl");    
        //qualifier name ...
        QName qname = new QName("http://ws.enterprise.javacodegeeks.com/", "WebServiceImplService");
         Service service = Service.create(wsdlUrl, qname);

        WebServiceInterface sayHello = service.getPort(WebServiceInterface.class);
        Map<String, Object> requestContext = ((BindingProvider)sayHello).getRequestContext();

        requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8888/webservice/helloworld?wsdl");

        Map<String, List<String>> requestHeaders = new HashMap<String, List<String>>();
        requestHeaders.put("username", Collections.singletonList("nikos"));
        requestHeaders.put("Password", Collections.singletonList("superpassword"));
        requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);

        System.out.println(sayHello.getHelloWorldAsString("- This is Java Code Geeks"));

    }
}

可能最好但最復雜的是具有各種身份驗證方法的 WS-Security。 但它是最復雜的,並且有利於企業環境。 它允許您創建端到端身份驗證,並且有很多選項。 您可以在簡單的情況下使用Web 服務安全用戶名令牌配置文件

    <S12:Envelope xmlns:S11="..." xmlns:wsse="..." xmlns:wsu= "...">
  <S12:Header>
  ...
    <wsse:Security>
      <wsse:UsernameToken>
        <wsse:Username>NNK</wsse:Username>
        <wsse:Password Type="...#PasswordDigest">weYI3nXd8LjMNVksCKFV8t3rgHh3Rw==</wsse:Password>
        <wsse:Nonce>WScqanjCEAC4mQoBE07sAQ==</wsse:Nonce>
        <wsu:Created>2003-07-16T01:24:32</wsu:Created>
      </wsse:UsernameToken>
    </wsse:Security>
  ...
  </S12:Header>
...
</S12:Envelope>

我不知道您使用什么庫,但這里有一篇不錯的文章如何將 Rampart 安裝到 Axis2 並實現 UsernameToken 處理

但在某些簡化的情況下,您可以簡單地對 web 服務器進行 HTTP 基本身份驗證(通過 SSL)。 這可能是最糟糕的解決方案,但有時可能最容易實施。 另一種解決方案,不連接 soap 可以相互認證 SSL (與客戶端身份驗證)。

WS-Security 提供了標准方法來保護基於 SOAP 的 web 服務,WS-Security Policy 說明了如何將這些安全要求傳達給外界。

身份驗證可以使用用戶名/密碼 - 基於 UsernameToken 或證書。

由於您是基於 Java - 您可以使用開源WSO2 應用服務器來部署您的服務,並且只需點擊幾下即可保護您的服務。

進一步解釋了如何做到這一點......

謝謝...

是通過具有身份驗證的 JAX-WS 的 Web 服務的一個很好的示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM