如何验证基于soap的java Web服务?

时间:2011-07-23 10:53:15

标签: java web-services soap

我正在使用Java开发基于Soap的Web服务。任何人都可以告诉我如何验证使用Web服务的客户端吗?

感谢。

4 个答案:

答案 0 :(得分:8)

可能最好但最复杂的是使用各种身份验证方法的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

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

答案 1 :(得分:7)

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

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

我们最常使用WS-Security进行SOAP Web服务。 WS-security profile 确定如何启用WS-security。

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

    <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标头。

    使用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"));
    
        }
    }
    

答案 2 :(得分:3)

WS-Security提供了保护基于SOAP的Web服务的标准方法,WS-Security Policy说明了如何将这些安全要求传达给外部世界。

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

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

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

...谢谢

答案 3 :(得分:2)

Here是通过JAX-WS进行身份验证的Web服务的一个很好的例子