【问题标题】:Web service soap header authenticationWeb服务soap头认证
【发布时间】:2011-03-01 05:17:36
【问题描述】:

我有一个网络服务,我想从肥皂头验证用户。也就是说,我想检查soap标头中的令牌ID(随机数)并根据我的数据库中的值验证它,如果数字匹配,我允许请求通过,否则我不想允许执行我的网络方法。

有没有使用 SOAP 标头的干净方法?

谢谢,

Mrinal Jaiswal

【问题讨论】:

    标签: web-services soap header


    【解决方案1】:

    你看过WS-Security吗?假设您还没有将它用于其他用途,您可以在 Username 元素等中携带您的令牌。

    <?xml version="1.0"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
      <soapenv:Header>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
          <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-1">
            <wsse:Username>yourusername</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">yourpassword</wsse:Password>
          </wsse:UsernameToken>
        </wsse:Security>
      </soapenv:Header>
      <soapenv:Body>
        <yourbodygoeshere>
      </soapenv:Body>
    </soapenv:Envelope>
    

    【讨论】:

    • 现在在请求中发送这些标头后,我们如何在服务实现类中作为 WS 生产者端读取 username 和 passwr=ord ?
    【解决方案2】:

    我使用 JDK API 创建了一个 Web 服务,并通过soap header 进行了简单的身份验证。 这个简单的项目提供两种服务:

    • 登录
    • 从服务器获取消息

    客户端将soap body中的用户名和密码发送到服务器,如果登录成功,服务器将在soap header中返回一个token。 客户端通过在soap头中包含这个令牌来调用getMessage服务,服务器检查令牌,如果是登录用户,则返回成功消息,否则返回失败消息。

    以下是代码:

    package com.aug.ws;
    
    import javax.jws.WebMethod;
    import javax.jws.WebParam;
    import javax.jws.WebService;
    import javax.jws.WebParam.Mode;
    import javax.jws.soap.SOAPBinding;
    import javax.jws.soap.SOAPBinding.Style;
    import javax.xml.ws.Holder;
    
    //Service Endpoint Interface
    @WebService
    @SOAPBinding(style = Style.RPC)
    public interface HelloWorld {
    
        @WebMethod
        void login(String userName, String password, @WebParam(header = true, mode = Mode.OUT, name = "token") Holder<String> token);
    
        String getMessage(String message);
    }
    
    
    package com.aug.ws;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.annotation.Resource;
    import javax.jws.WebMethod;
    import javax.jws.WebParam;
    import javax.jws.WebParam.Mode;
    import javax.jws.WebService;
    import javax.xml.namespace.QName;
    import javax.xml.ws.Holder;
    import javax.xml.ws.WebServiceContext;
    import javax.xml.ws.handler.MessageContext;
    
    import com.sun.xml.internal.ws.api.message.Header;
    import com.sun.xml.internal.ws.api.message.HeaderList;
    import com.sun.xml.internal.ws.developer.JAXWSProperties;
    
    @WebService(endpointInterface = "com.aug.ws.HelloWorld")
    public class HelloWorldImpl implements HelloWorld {
    
        private Map<String, String> authorizedUsers = new HashMap<String, String>();
    
        @Resource
        WebServiceContext wsctx;
    
        @Override
        @WebMethod
        public void login(String userName, String password, @WebParam(header = true, mode = Mode.OUT, name = "token") Holder<String> token) {
            if (("user1".equals(userName) && "pwd1".equals(password)) || ("user2".equals(userName) && "pwd2".equals(password))) {
                String tokenValue = "authorizeduser1234" + userName;
                token.value = tokenValue;
                authorizedUsers.put(tokenValue, userName);
    
                System.out.println("---------------- token: " + tokenValue);
            }
        }
    
        @Override
        @WebMethod
        public String getMessage(String message) {
            if (isLoggedInUser()) {
                return "JAX-WS message: " + message;
            }
        return "Invalid access!";
        }
    
        /**
         * Check token from SOAP Header
         * @return
         */
        private boolean isLoggedInUser() {
            System.out.println("wsctx: " + wsctx);
    
            MessageContext mctx = wsctx.getMessageContext();
            HeaderList headerList = (HeaderList)     mctx.get(JAXWSProperties.INBOUND_HEADER_LIST_PROPERTY);
    
            String nameSpace = "http://ws.aug.com/";
            QName token = new QName(nameSpace, "token");
    
            try {
                Header tokenHeader = headerList.get(token, true);
                if (tokenHeader != null) {
                    String user = authorizedUsers.get(tokenHeader.getStringContent());
                    if (user != null) {
                        System.out.println(user + " has logged in.");
                        return true;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return false;
        }
    }
    
    
    package com.aug.endpoint;
    import javax.xml.ws.Endpoint;
    
    import com.aug.ws.HelloWorldImpl;
    
    public class HelloWorldPublisher {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            Endpoint.publish("http://localhost:9000/ws/hello", new HelloWorldImpl());
    
            System.out.println("\nWeb service published @ http://localhost:9000/ws/hello");
            System.out.println("You may call the web service now");
        }
    
    }
    
    
    package com.aug.client;
    
    import java.net.MalformedURLException;
    import java.net.URL;
    
    import javax.xml.namespace.QName;
    import javax.xml.ws.Service;
    
    import com.aug.ws.HelloWorld;
    import com.sun.xml.internal.ws.api.message.HeaderList;
    import com.sun.xml.internal.ws.api.message.Headers;
    import com.sun.xml.internal.ws.developer.JAXWSProperties;
    import com.sun.xml.internal.ws.developer.WSBindingProvider;
    
    public class HelloWorldClient {
    
        private static final String WS_URL = "http://localhost:9000/ws/hello?wsdl";
        private static final String NAME_SPACE = "http://ws.aug.com/";
    
        public static String login() throws Exception {
    
            URL url = new URL(WS_URL);
            QName qname = new QName(NAME_SPACE, "HelloWorldImplService");
    
            Service service = Service.create(url, qname);
            HelloWorld hello = service.getPort(HelloWorld.class);
    
            hello.login("user1", "pwd1", null);
    
            WSBindingProvider bp = (WSBindingProvider) hello;
            HeaderList headerList = (HeaderList)     bp.getResponseContext().get(JAXWSProperties.INBOUND_HEADER_LIST_PROPERTY);
            bp.close();
    
            return headerList.get(new QName(NAME_SPACE, "token"), true).getStringContent();
        }
    
        public static void getMessage() throws Exception  {
            String token = login();
            System.out.println("token: " + token);
    
            URL url = new URL(WS_URL);
            QName qname = new QName(NAME_SPACE, "HelloWorldImplService");
    
            Service service = Service.create(url, qname);
            HelloWorld hello = service.getPort(HelloWorld.class);
            WSBindingProvider bp = (WSBindingProvider) hello;
    
            bp.setOutboundHeaders(
                    Headers.create(new QName(NAME_SPACE, "token"), token)
            );
    
            System.out.println(hello.getMessage("hello world"));
    
            bp.close();
        }
    
        public static void main(String[] args) throws Exception {
            getMessage();
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多