回答
可能是最好的但最複雜的是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(使用客戶端身份驗證)。
Here是通過JAX-WS web服務與認證一個很好的例子
WS-Security提供的標準的方式來保護基於SOAP的Web服務和WS-Security策略說如何溝通這些安全要求,出邊世界。
身份驗證可以使用用戶名/密碼 - 使用UsernameToken或基於證書。
由於您是基於Java的 - 您可以使用開源WSO2 Application Server來部署您的服務,只需點擊幾下即可保護您的服務。
This進一步解釋如何做到這一點?
謝謝...
不同的方式和不同類型的安全性,我們可以實現: 消息級安全
- 運輸級安全:如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安全性。
- WSS X.509令牌簡介:使用X.509框架的WSS X.509安全配置文件。
- 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頭簡單添加用戶和口令。
- Application Authentication with JAX-WS 這裏有一個詳細的例子來告訴你如何與JAX-WS處理應用程序級別的認證。
- Container Authentication with JAX-WS + (Tomcat version) 下面是一個詳細示例,向您展示如何使用Tomcat下的JAX-WS實現容器身份驗證。
應用程序驗證用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"));
}
}
- 1. Web服務(基於SOAP/Restful)
- 2. Restful web服務如何比基於SOAP的web服務更好
- 3. 如何在java中使用基於外部SOAP的Web服務?
- 4. 如何在javascript/ajax中基於Java的Soap Web服務?
- 5. IIS驗證的SOAP Web服務
- 6. SOAP Web服務身份驗證
- 7. Java,Netbeans,Tomcat中基於SOAP的Web服務的安全性
- 8. 用於使用NTLM身份驗證的SOAP Web服務的Java客戶端
- 9. 用於驗證身份驗證令牌的SOAP Web服務屬性
- 10. Java基於Web的防火牆驗證
- 11. 如何驗證此HTTPS SOAP服務?
- 12. Web服務的基本身份驗證
- 13. 對基於Linux的SOAP Web服務服務器的建議
- 14. 如何在SOAP中使用基於證書的身份驗證?
- 15. 基於SSL和客戶端證書的Java SOAP服務
- 16. Web服務soap頭認證
- 17. 如何使用.NET(C#)與基於Java的客戶端創建SOAP Web服務?
- 18. 並行java SOAP web服務
- 19. 基於WCF的基於SSL Rest的Web服務基礎認證
- 20. 驗證Web服務
- 21. 用於基於SOAP的Web金融服務的XML標準
- 22. 基於AD組的WCF Web服務身份驗證
- 23. 替代基於Java/Spring的Web服務
- 24. java soap asmx基本認證
- 25. 尋找用於創建基於SOAP的Web服務的輕量級Java堆棧
- 26. 如何實現基於窗口的身份驗證的Web服務
- 27. Spring的web服務驗證
- 28. 如何使用Python爲Web服務設置基於令牌的身份驗證?
- 29. ASP.NET Web服務 - 基於驗證限制一些併發實例
- 30. 如何通過curl驗證web服務?