2011-07-23 54 views

回答

6

可能是最好的但最複雜的是WS-Security具有各種認證方法。但它是最複雜的,對企業環境有好處。它允許您創建端到端的身份驗證,並且有很多選項。你可以在簡單情況下例如使用Web Services Security UsernameToken Profile

<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> 

我不知道你用什麼庫,但這裏是一個很好的文章how to install Rampart into Axis2 and implement UsernameToken handling

但是在一些簡化的情況下,您可以簡單地將HTTP Basic Authentication(通過SSL)發送到Web服務器。這可能是最糟糕的解決方案,但有時可能最容易實現。另一個與soap無關的解決方案可以是相互認證的SSL(使用客戶端身份驗證)。

2

Here是通過JAX-WS web服務與認證一個很好的例子

3

WS-Security提供的標準的方式來保護基於SOAP的Web服務和WS-Security策略說如何溝通這些安全要求,出邊世界。

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

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

This進一步解釋如何做到這一點?

謝謝...

4

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

  • 運輸級安全:如HTTP基本/摘要和SSL
  • 消息級安全:如WS-Security的,XML數字簽名,XML加密,XKMS(X ML ķ EY 中號 anagement 小號 pecification),XACML(E X tensible CCESS Ç ONTROL 中號 arkup 大號 anguage),SAML(小號 ecure ssertion 中號 arkup 大號語言),ebXML消息服務,自由聯盟項目。 for more detals
  • 訪問控制安全:安全角色是根據特定條件授予用戶或組的權限。

通常我們使用WS-Security的SOAP Web服務。 A WS-security profile確定如何啓用WS安全性。

  1. WSS X.509令牌簡介:使用X.509框架的WSS X.509安全配置文件。
  2. WSS UsernameToken配置文件:指定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頭部如下:

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頭簡單添加用戶和口令。

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

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")); 

    } 
}