Защитите встроенный Java-веб-сервис с помощью javax.jws без сервера приложений. - PullRequest
2 голосов
/ 15 сентября 2011

Я написал следующий код для реализации веб-службы Java, которая взаимодействует с приложением, написанным на другом языке на том же хосте:

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

@WebService(name = "MyWebService") 
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 
public class MyWebService { 

    @WebMethod(operationName = "methodName", action = "urn:#methodName") 
    @WebResult(name = "result",  partName = "output") 
    public String methodName(@WebParam(name = "param1",  partName = "input")  String param1,
                                        @WebParam(name = "param2",  partName = "input")  String param2){

            // ...do something

        return "You called this service with params: "  + param1 + "," + param2;
    }

Поскольку требования не заключаются в использовании сервера приложений для предоставления веб-службы, я создал экземпляр службы из другого класса следующим образом:

        Endpoint endpoint = Endpoint.create(new MyWebService());
        URL url = new URL("http://localhost:7777/MyWebService");
        endpoint.publish(url.toString());

Вопросы:

1) Какой самый простой способ защитить эту службу с помощью имени пользователя и пароля, учитывая архитектуру этого проекта? Любой пример кода будет принята с благодарностью.

2) Я провел некоторое исследование и нашел использование SOAPHandler, и я думаю, что он будет работать для меня. В случае использования класса SOAPHandler, как добавить заголовки к сообщению, требующие аутентификации от клиента?

Заранее спасибо


Большое спасибо за ответ, это направление, в котором я тоже следую, но

когда я проверяю любой из заголовков, например:

SOAPHeader header = soapContext.getMessage().getSOAPPart().getEnvelope().getHeader();
Iterator<SOAPElement> iterator = header.getAllAttributes();

Я получаю исключение нулевого указателя ... есть идеи?

Ответы [ 2 ]

0 голосов
/ 15 сентября 2011

То, что вы сделали, достаточно справедливо.
Что касается аутентификации, вы можете просто предоставить метод для передачи имени пользователя и пароля в качестве учетных данных для входа.
После того, как пользователь предоставил правильные учетные данные, он был аутентифицирован.
Примечание: Теперь вы должны сохранить данные сеанса и убедиться, что входящий запрос от аутентифицированного пользователя. Endpoint просто развертывает внутри себя облегченный http-сервер. Вы должны разработать свою реализацию веб-службы, чтобы сохранить «состояние» среди запросов.

У вас есть еще 2 варианта.

  1. Выполните аутентификацию на уровне SOAP. Я бы не очень рекомендовал Это. Но если вы это сделаете, обратите внимание, что Endpoint не развертывает WSDL. Таким образом, вы должны общаться именно с клиентом, соединяющимся, заголовок SOAP, который вы ожидаете. Впрочем, можно написать WSDL себя и "прикрепи" его к Endpoint.
  2. Выполните аутентификацию на уровне http-запроса. То есть добавить токен или файл cookie для запроса http. Если честно, я не помню, если это легко с помощью Endpoint
0 голосов
/ 15 сентября 2011

Я сделал рабочую программу.Чтобы добавить к тому, что вы уже узнали, ниже приведен способ использования обработчика

Endpoint endpoint = Endpoint.create(new MyWebService());
        Binding binding = endpoint.getBinding();
        List<Handler> handlerChain = new ArrayList<Handler>(1);
        handlerChain.add(new MyHandler());
        binding.setHandlerChain(handlerChain);
        URL url = new URL("http://localhost:7777/MyWebService");
        endpoint.publish(url.toString());

MyHandler - расширяющего класс интерфейса Handler.Кроме того, вы можете использовать аннотацию @HandlerChain, для которой потребуется обработчик xml-файла конфигурации.Настройте это для входящих сообщений * только 1008 *

public class MyHandler implements SOAPHandler{

    @Override
    public Set<?> getHeaders() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void close(MessageContext context) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean handleFault(MessageContext context) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean handleMessage(MessageContext context) {
        System.out.println("Hehehe the handler");

        SOAPMessageContext soapContext = (SOAPMessageContext)context;
        try {
            SOAPHeader header = soapContext.getMessage().getSOAPPart().getEnvelope().getHeader();
            //Check there if the required data (username/password) is present in header or not and return true/false accordingly. 
        } catch (SOAPException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return true;
    }

}

Со стороны клиента также, если ваш клиент использует JAB-WS, вам придется использовать клиентские обработчики.Ниже приведен типичный пример вызова клиента JAX-WS

Dispatch<Source> dispatch = … create a Dispatch<Source>
dispatch.getBinding().setHandlerChain(chain)
Source request = … create a Source object
Source response = dispatch.invoke(request);

Здесь обработчик в цепочке добавит заголовок к исходящему запросу.Настройте это только для Исходящих сообщений.

...