Anwendungsauthentifizierung mit JAX-WS

Eine der gebräuchlichsten Methoden zur Authentifizierung in JAX-WS besteht darin, dass der Client „Benutzername“ und „Kennwort“ bereitstellt, diese im SOAP-Anforderungsheader angehängt und an den Server sendet, das SOAP-Dokument vom Server parsen und den bereitgestellten „Benutzernamen“ und „Kennwort“ abrufen. aus dem Anforderungsheader und Validierung aus der Datenbank oder einer anderen Methode.

In diesem Artikel zeigen wir Ihnen, wie Sie die obige Authentifizierung auf Anwendungsebene in JAX-WS ** implementieren.

Ideen …​

Geben Sie auf der ** Web-Service-Client-Site einfach Ihren "Benutzernamen" und "Kennwort" in den Anforderungsheader ein.

    Map<String, Object> req__ctx = ((BindingProvider)port).getRequestContext();
    req__ctx.put(BindingProvider.ENDPOINT__ADDRESS__PROPERTY, WS__URL);

    Map<String, List<String>> headers = new HashMap<String, List<String>>();
    headers.put("Username", Collections.singletonList("mkyong"));
    headers.put("Password", Collections.singletonList("password"));
    req__ctx.put(MessageContext.HTTP__REQUEST__HEADERS, headers);

Rufen Sie auf der ** Webservice-Server-Site die Parameter für den Anforderungsheader über "WebServiceContext" ab.

    @Resource
    WebServiceContext wsctx;

    @Override
    public String method() {

        MessageContext mctx = wsctx.getMessageContext();

   //get detail from request headers
        Map http__headers = (Map) mctx.get(MessageContext.HTTP__REQUEST__HEADERS);
        List userList = (List) http__headers.get("Username");
        List passList = (List) http__headers.get("Password");

   //...

Das ist alles, jetzt wird Ihre bereitgestellte JAX-WS-Authentifizierung auf Anwendungsebene unterstützt.

Authentifizierung mit JAX-WS-Beispiel

Sehen Sie ein vollständiges Beispiel.

1. WebService Server

Erstellen Sie ein einfaches JAX-WS-Hello-World-Beispiel für die Authentifizierung auf Anwendungsebene.

Datei: Hallo Welt.java

package com.mkyong.ws;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
//Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.RPC)
public interface HelloWorld{

    @WebMethod String getHelloWorldAsString();

}

Hallo Welt Impl.java

package com.mkyong.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;
//Service Implementation Bean
@WebService(endpointInterface = "com.mkyong.ws.HelloWorld")
public class HelloWorldImpl implements HelloWorld{

    @Resource
    WebServiceContext wsctx;

    @Override
    public String getHelloWorldAsString() {

    MessageContext mctx = wsctx.getMessageContext();

   //get detail from request headers
        Map http__headers = (Map) mctx.get(MessageContext.HTTP__REQUEST__HEADERS);
        List userList = (List) http__headers.get("Username");
        List passList = (List) http__headers.get("Password");

        String username = "";
        String password = "";

        if(userList!=null){
           //get username
            username = userList.get(0).toString();
        }

        if(passList!=null){
           //get password
            password = passList.get(0).toString();
        }

       //Should validate username and password with database
        if (username.equals("mkyong") && password.equals("password")){
            return "Hello World JAX-WS - Valid User!";
        }else{
            return "Unknown User!";
        }

    }
}

2. EndPoint Publisher

Erstellen Sie einen Endpoint-Publisher, der unter dieser URL über dem Webdienst bereitgestellt werden soll:

" Http://localhost: 9999/ws/hello "

Datei: Hello World Publisher.java

package com.mkyong.endpoint;

import javax.xml.ws.Endpoint;
import com.mkyong.ws.HelloWorldImpl;
 //Endpoint publisher
public class HelloWorldPublisher{

    public static void main(String[]args) {
       Endpoint.publish("http://localhost:9999/ws/hello", new HelloWorldImpl());
    }

}

3. WebService Client

Erstellen Sie einen Web-Service-Client, um zur Authentifizierung "Benutzername" und "Kennwort" zu senden.

Datei: HelloWorldClient.java

package com.mkyong.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.mkyong.ws.HelloWorld;

public class HelloWorldClient{

    private static final String WS__URL = "http://localhost:9999/ws/hello?wsdl";

    public static void main(String[]args) throws Exception {

    URL url = new URL(WS__URL);
        QName qname = new QName("http://ws.mkyong.com/", "HelloWorldImplService");

        Service service = Service.create(url, qname);
        HelloWorld hello = service.getPort(HelloWorld.class);

       /** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** UserName & Password ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** /        Map<String, Object> req__ctx = ((BindingProvider)hello).getRequestContext();
        req__ctx.put(BindingProvider.ENDPOINT__ADDRESS__PROPERTY, WS__URL);

        Map<String, List<String>> headers = new HashMap<String, List<String>>();
        headers.put("Username", Collections.singletonList("mkyong"));
        headers.put("Password", Collections.singletonList("password"));
        req__ctx.put(MessageContext.HTTP__REQUEST__HEADERS, headers);
       /** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** /
        System.out.println(hello.getHelloWorldAsString());

    }
}

Ausgabe

Hello World JAX-WS - Valid User!

4. SOAP-Datenverkehr verfolgen

Zeigt von oben nach unten, wie der SOAP-Umschlag zwischen Client und Server fließt.

{leer} 1. Die Client-Sendeanforderung, der Benutzername „ mkyong “ und das Kennwort „ password “ sind im SOAP-Umschlag enthalten.

POST/ws/hello?wsdl HTTP/1.1
Password: password
Username: mkyong
SOAPAction: ""
Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, ** ; q=.2, ** /** ; q=.2
Content-Type: text/xml; charset=utf-8
User-Agent: Java/1.6.0__13
Host: localhost:8888
Connection: keep-alive
Content-Length: 178

<?xml version="1.0" ?>
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
        <S:Body>
            <ns2:getHelloWorldAsString xmlns:ns2="http://ws.mkyong.com/"/>
        </S:Body>
    </S:Envelope>

{leer} 2. Server sendet eine normale Antwort zurück.

HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: text/xml; charset=utf-8

<?xml version="1.0" ?>
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
        <S:Body>
            <ns2:getHelloWorldAsStringResponse xmlns:ns2="http://ws.mkyong.com/">
                <return>Hello World JAX-WS - Valid User!</return>
            </ns2:getHelloWorldAsStringResponse>
        </S:Body>
    </S:Envelope>

Erledigt.