如何validation基于soap的java Web服务?

我正在使用Java开发基于Soap的Web服务。 任何人都可以让我知道如何validation使用Web服务的客户端?

谢谢。

可能最好但最复杂的是具有各种身份validation方法的WS-Security。 但它最复杂,对企业环境也有好处。 它允许您创建端到端的身份validation,并且有很多选项。 您可以在简单的情况下使用Web Services Security UsernameToken Profile

  ...   NNK weYI3nXd8LjMNVksCKFV8t3rgHh3Rw== WScqanjCEAC4mQoBE07sAQ== 2003-07-16T01:24:32   ...  ...  

我不知道你使用的是什么库,但这里有一篇很好的文章如何将Rampart安装到Axis2并实现UsernameToken处理 。

但在某些简化案例中,您只需对Web服务器(通过SSL)进行HTTP基本身份validation即可。 这可能是最糟糕的解决方案,但有时可能最容易实现。 另一个与soap无关的解决方案可以是相互认证的SSL(使用客户端身份validation)。

我们可以实现不同的方式和不同类型的安全性:消息级安全性

  • 传输级安全性 :例如HTTP Basic / Digest和SSL
  • 消息级安全性 :例如WS-Security,XML数字签名,XML加密,XKMS( X ML K ey M管理规范),XACML(e X tensible A ccess C ontrol M arkup L anguage),SAML( S ecure A ssertion) M arkup L anguage),ebXML消息服务,自由联盟项目。 更多的
  • 访问控制安全性 :安全角色是根据特定条件授予用户或组的权限。

最常见的是我们将WS-Security用于SOAP Web服务。 WS-security配置文件确定如何启用WS-security。

  1. WSS X.509令牌配置文件:将X.509框架用于WSS X.509安全配置文件。
  2. WSS UsernameToken配置文件 :指定X.509令牌配置文件时,您还可以在SOAP请求中提供UsernameToken。

例:

  user CBb7a2itQDgxVkqYnFtggUxtuqk= 5ABcqPZWb6ImI2E6tob8MQ== 2010-06-08T07:26:50Z  

上面的元素包含在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进行应用程序身份validation以下是一个详细示例,向您展示如何使用JAX-WS处理应用程序级别身份validation。
  • 使用JAX-WS +进行容器身份validation(Tomcat版本)这是一个详细示例,向您展示如何在Tomcat下使用JAX-WS实现容器身份validation。

使用WebServiceContext接口使用JAX-WS进行应用程序身份validation

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 requestContext = ((BindingProvider)sayHello).getRequestContext(); requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8888/webservice/helloworld?wsdl"); Map> requestHeaders = new HashMap>(); 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提供了保护基于SOAP的Web服务的标准方法,WS-Security Policy说明了如何将这些安全要求传达给外部世界。

身份validation可以使用用户名/密码 – 使用UsernameToken或基于证书。

由于您是基于Java的 – 您可以使用开源WSO2 Application Server来部署您的服务,只需点击几下就可以保护您的服务。

这进一步解释了如何做到这一点……

谢谢…

以下是通过JAX-WS进行身份validation的Web服务的一个很好的示例