Аутентификация приложения с помощью JAX-WS

Одним из распространенных способов обработки аутентификации в JAX-WS является то, что клиент предоставляет «имя пользователя» и «пароль», присоединяет их в заголовке запроса SOAP и отправляет на сервер, сервер анализирует документ SOAP и получает предоставленные «имя пользователя» и «пароль». из заголовка запроса и выполнить проверку из базы данных, или любым другим способом.

В этой статье мы покажем вам, как реализовать вышеупомянутую « аутентификацию на уровне приложения в JAX-WS ».

Идеи …​

На сайте веб-клиента просто введите свое имя пользователя и пароль в заголовок запроса.

    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);

На сайте сервера веб-служб получите параметры заголовка запроса через WebServiceContext .

    @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");

   //...

Вот и все, теперь ваш развернутый JAX-WS поддерживает аутентификацию на уровне приложений.

Аутентификация с примером JAX-WS

Смотрите полный пример.

1. Сервер WebService

Создайте простой пример JAX-WS hello world для обработки аутентификации на уровне приложения.

File: HelloWorld.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();

}

Hello World 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

Создайте издателя конечной точки для развертывания вышеуказанного веб-сервиса по этому URL:

« Http://локальный: 9999/WS/hello »

File: HelloWorldPublisher.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

Создайте клиент веб-службы для отправки имени пользователя и пароля для аутентификации.

File: 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());

    }
}

Выход

Hello World JAX-WS - Valid User!

4. Отслеживание трафика SOAP

Сверху вниз, показывая, как конверт SOAP проходит между клиентом и сервером.

{Пусто} 1. Запрос на отправку клиентом, имя пользователя « mkyong » и пароль « password » включены в конверт SOAP.

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>

{Пусто} 2. Сервер отправляет обратно нормальный ответ.

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>

Готово.

Скачать исходный код

Загрузить - ссылка://wp-content/uploads/2010/12/JAX-WS-Application-Authentication-Example.zip[JAX-WS-Application-Authentication-Example.zip](10 КБ)

ссылка://тег/аутентификация/[аутентификация]ссылка://тег/jax-ws/[jax-ws]ссылка://тег/безопасность/[безопасность]ссылка://тег/веб-сервисы/[веб-сервисы]

Related