我正在使用java开发基于soap的web服务。有人能告诉我如何验证使用web服务的客户机吗?谢谢。
ndh0cuux1#
下面是一个通过jax-ws进行身份验证的webservice的好例子
f0brbegy2#
我们可以实现不同的方式和不同类型的安全性:消息级安全性传输级安全性:如http基本/摘要和ssl消息级安全:如ws-security、xml数字签名、xml加密、xkms(xml密钥管理规范)、xacml(可扩展访问控制标记语言)、saml(安全Assert标记语言)、ebxml消息服务、自由联盟项目。更多细节访问控制security:a security 角色是根据特定条件授予用户或组的权限。对于soapweb服务,我们通常使用ws-security。ws-security概要文件确定如何启用ws-security。wss x.509令牌配置文件:将x.509框架用于wss x.509安全配置文件。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头中,如下所示:
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进行应用程序身份验证这里有一个详细的示例,向您展示如何使用jax-ws处理应用程序级身份验证。jax-ws+容器身份验证(tomcat版本)下面是一个详细的示例,演示如何在tomcat下使用jax-ws实现容器身份验证。使用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!"; } } }
Web服务客户端.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")); } }
jw5wzhpr3#
ws-security提供了保护基于soap的web服务的标准方法,ws-security策略说明了如何将这些安全需求传递给外部世界。可以使用用户名/密码进行身份验证-使用用户名令牌或基于证书的身份验证。因为您是基于java的,所以您可以使用开源wso2应用服务器来部署您的服务,只需几次单击就可以保护您的服务。这进一步解释了如何做到这一点。。。谢谢。。。
pb3s4cty4#
可能最好但最复杂的是ws-security和各种身份验证方法。但它是最复杂的,对企业环境也是有利的。它允许您创建端到端身份验证,并且有很多选项。您可以在简单的情况下使用web服务安全usernametoken配置文件
<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(使用客户端认证)。
4条答案
按热度按时间ndh0cuux1#
下面是一个通过jax-ws进行身份验证的webservice的好例子
f0brbegy2#
我们可以实现不同的方式和不同类型的安全性:消息级安全性
传输级安全性:如http基本/摘要和ssl
消息级安全:如ws-security、xml数字签名、xml加密、xkms(xml密钥管理规范)、xacml(可扩展访问控制标记语言)、saml(安全Assert标记语言)、ebxml消息服务、自由联盟项目。更多细节
访问控制security:a security 角色是根据特定条件授予用户或组的权限。
对于soapweb服务,我们通常使用ws-security。ws-security概要文件确定如何启用ws-security。
wss x.509令牌配置文件:将x.509框架用于wss x.509安全配置文件。
wss usernametoken profile:指定x.509令牌配置文件时,还可以在soap请求中提供usernametoken。
例子:
上述元素包含到soap头中,如下所示:
下面的示例只是简单地向http头添加用户和密码。
使用jax-ws进行应用程序身份验证这里有一个详细的示例,向您展示如何使用jax-ws处理应用程序级身份验证。
jax-ws+容器身份验证(tomcat版本)下面是一个详细的示例,演示如何在tomcat下使用jax-ws实现容器身份验证。
使用webservicecontext接口的jax-ws应用程序身份验证
webserviceimpl.java
Web服务客户端.java
jw5wzhpr3#
ws-security提供了保护基于soap的web服务的标准方法,ws-security策略说明了如何将这些安全需求传递给外部世界。
可以使用用户名/密码进行身份验证-使用用户名令牌或基于证书的身份验证。
因为您是基于java的,所以您可以使用开源wso2应用服务器来部署您的服务,只需几次单击就可以保护您的服务。
这进一步解释了如何做到这一点。。。
谢谢。。。
pb3s4cty4#
可能最好但最复杂的是ws-security和各种身份验证方法。但它是最复杂的,对企业环境也是有利的。它允许您创建端到端身份验证,并且有很多选项。您可以在简单的情况下使用web服务安全usernametoken配置文件
我不知道您使用什么库,但这里有一篇很好的文章,介绍如何将rampart安装到axis2中并实现usernametoken处理。
但在某些简化的情况下,您可以简单地对web服务器进行http基本身份验证(通过ssl)。这可能是最糟糕的解决方案,但有时可能是最容易实现的。另一个未与soap连接的解决方案可以是相互认证的ssl(使用客户端认证)。