Как мне работать с WS-Security, когда у меня есть только wsdl? - PullRequest
2 голосов
/ 14 ноября 2010

Я пытаюсь разработать автономное клиентское приложение, которое использует веб-сервисы в контейнере Glassfish (Metro). Все, с чем я должен работать - это wsdl для wervices, которые я пытаюсь использовать. Wsdl изобилует всевозможными тегами 'wsp: Policy'. Похоже, IssuedToken, Trust13, шифрование все используются. Поэтому я сгенерировал некоторый код из netbeans и JAX-WS. Все прошло хорошо, но при попытке запустить клиент я получаю: 'WST0029: местоположение STS не может быть получено ни из IssuedToken, ни из конфигурации клиента для доступа к услуге http://localhost:8080/ ....'

Именно тогда мне пришло в голову, что я ничего не знаю о WSS. Не похоже, что какой-либо код был сгенерирован для обеспечения безопасности. Итак, мне придется идти с нуля. Так с чего начать? Книги? Учебники

ТИА

1 Ответ

2 голосов
/ 18 августа 2011

Metro применяет политику во время выполнения из файла конфигурации WSDL или wsit-client.xml. Вот почему не генерируется код, связанный с политиками. Согласно этому посту в настоящее время невозможно делать программно.

Этот учебник довольно хорошо объясняет некоторые вещи, которые вы можете делать с WSS, и, хотя все, возможно, не применимо в этом случае, это все еще хорошее чтение.

Самый простой способ генерации клиента с поддержкой WSS - использование сценария wsimport из Metro:

cd metro/bin/
mkdir src target
./wsimport.sh -s src -d target -extension -Xendorsed -verbose YourService.wsdl

Затем установите Metro на свой сервер приложений (скопируйте библиотеки в нужные места или запустите скрипт ant):

ant -f metro-on-glassfish.xml

Затем поместите локальный файл WSDL в ваш путь к классам (например, в папку ресурсов), чтобы Metro мог получить его во время выполнения для применения политик из сгенерированного YourService класса:

private final static URL YOURSERVICE_WSDL_LOCATION;

// This is enough, you don't need the wsdlLocation attribute 
// on the @WebServiceClient annotation if you have this.
static {
    YOURSERVICE_WSDL_LOCATION =
        CustomerService.class.getClassLoader().getResource("YourService.wsdl");
}

public YourService() {
    super(YOURSERVICE_WSDL_LOCATION, 
            new QName("http://tempuri.org/", "YourService"));
}

А если вы хотите WS-Addressing , вам может потребоваться добавить эту функцию вручную в метод привязки (Metro никогда не генерировал ее для меня, поэтому мне всегда приходится добавлять ее самостоятельно).

@WebEndpoint(name = "WSHttpBinding_IYourService")
public IYourService getWSHttpBindingIYourService() {
    WebServiceFeature wsAddressing = new AddressingFeature(true);

    IYourService service =
        super.getPort(new QName("http://xmlns.example.com/services/Your",
                "WSHttpBinding_IYourService"), IYourService.class, 
                wsAddressing);

    return service;
}
...