Как аутентифицировать Java-веб-сервисы на основе мыла? - PullRequest
16 голосов
/ 23 июля 2011

Я занимаюсь разработкой веб-сервисов на основе Soap с использованием Java.Может кто-нибудь, пожалуйста, дайте мне знать, как аутентифицировать клиента, который использует веб-сервисы?

Спасибо.

Ответы [ 4 ]

8 голосов
/ 23 июля 2011

Вероятно, лучшим, но самым сложным является WS-Security с различными методами аутентификации. Но это самый сложный и полезный для окружающей среды предприятия. Это позволяет вам создавать сквозную аутентификацию, и есть много вариантов. Вы можете в простом случае, например, использовать Безопасность веб-служб UsernameToken Profile

    <S12:Envelope xmlns:S11="..." xmlns:wsse="..." xmlns:wsu= "...">
  <S12:Header>
  ...
    <wsse:Security>
      <wsse:UsernameToken>
        <wsse:Username>NNK</wsse:Username>
        <wsse:Password Type="...#PasswordDigest">weYI3nXd8LjMNVksCKFV8t3rgHh3Rw==</wsse:Password>
        <wsse:Nonce>WScqanjCEAC4mQoBE07sAQ==</wsse:Nonce>
        <wsu:Created>2003-07-16T01:24:32</wsu:Created>
      </wsse:UsernameToken>
    </wsse:Security>
  ...
  </S12:Header>
...
</S12:Envelope>

Я не знаю, какую библиотеку вы используете, но вот хорошая статья , как установить Rampart в Axis2 и реализовать обработку UsernameToken .

Но в некоторых упрощенных случаях вы можете просто выполнить базовую HTTP-аутентификацию на веб-сервере (через SSL). Это может быть худшим решением, но иногда может быть проще в реализации. Другим решением, не связанным с мылом, может быть взаимная аутентификация SSL (с аутентификацией клиента).

7 голосов
/ 05 декабря 2015

Различные способы и разные виды безопасности, которые мы можем реализовать: Безопасность на уровне сообщений

  • Безопасность на транспортном уровне : Например, HTTP Basic / Digest и SSL
  • Безопасность на уровне сообщений : такие как WS-Security, цифровая подпись XML, шифрование XML, XKMS ( X ML K ey M anagement S pecification), XACML (e X растяжимый A ccess C контроль M arkup L anguage), SAML ( S ecure A ssertion M arkup L anguage), служба сообщений ebXML, Союз Свободы Проект. для более подробной информации
  • Безопасность контроля доступа : Роль безопасности - это привилегия, предоставляемая пользователям или группам на основе определенных условий.

Чаще всего мы используем WS-Security для SOAP Web Services. A Профиль WS-безопасности определяет, как активируется WS-security.

  1. Профиль токена WSS X.509: Используйте каркас X.509 для профиля безопасности WSS X.509.
  2. WSS UsernameToken Profile : При указании профиля токена X.509 вы также можете указать UsernameToken в запросе SOAP.

пример:

<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-6138db82-5a4c-4bf7-915f-af7a10d9ae96">
  <wsse:Username>user</wsse:Username>
  <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">CBb7a2itQDgxVkqYnFtggUxtuqk=</wsse:Password>
  <wsse:Nonce>5ABcqPZWb6ImI2E6tob8MQ==</wsse:Nonce>
  <wsu:Created>2010-06-08T07:26:50Z</wsu:Created>
</wsse:UsernameToken>

Вышеуказанный элемент включает в заголовок SOAP следующее:

SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
    SOAPHeader header = envelope.addHeader();
    SOAPElement security = header.addChildElement("Security", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
    SOAPElement usernameToken = security.addChildElement("UsernameToken", "wsse");
    SOAPElement username = usernameToken.addChildElement("Username", "wsse");
    username.addTextNode(user);

    SOAPElement password = usernameToken.addChildElement("Password", "wsse");
    password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest");
    password.addTextNode(encodedPass); //encodedPass = Base64 ( SHA-1 ( nonce + created + password ) )

    SOAPElement nonce =
        usernameToken.addChildElement("Nonce", "wsse");
    nonce.addTextNode(Base64.encodeBytes(nonceString.getBytes()));

    SOAPElement created = usernameToken.addChildElement("Created", "wsu","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");

    created.addTextNode(creatTime);

В следующем примере показано простое добавление пользователя и пароля только в заголовок HTTP.

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

WebServiceImpl.java

package com.javacodegeeks.enterprise.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;

@WebService(endpointInterface = "com.javacodegeeks.enterprise.ws.WebServiceInterface")
public class WebServiceImpl implements WebServiceInterface {

    @Resource
    WebServiceContext webServiceContext;

    @Override
    public String getHelloWorldAsString(String str) {

        MessageContext messageContext = webServiceContext.getMessageContext();

        // get request headers
        Map<?,?> requestHeaders = (Map<?,?>) messageContext.get(MessageContext.HTTP_REQUEST_HEADERS);
        List<?> usernameList = (List<?>) requestHeaders.get("username");
        List<?> passwordList = (List<?>) requestHeaders.get("password");

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

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

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

                // of course this is not real validation
                // you should validate your users from stored databases credentials
        if (username.equals("nikos") && password.equals("superpassword")) {

            return "Valid User :"+str;

        } else {

            return "Unknown User!";
        }
    }
}

WebServiceClient.java

package com.javacodegeeks.enterprise.ws.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.javacodegeeks.enterprise.ws.WebServiceInterface;

public class WebServiceClient{

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

        URL wsdlUrl = new URL("http://localhost:8888/webservice/helloworld?wsdl");    
        //qualifier name ...
        QName qname = new QName("http://ws.enterprise.javacodegeeks.com/", "WebServiceImplService");
         Service service = Service.create(wsdlUrl, qname);

        WebServiceInterface sayHello = service.getPort(WebServiceInterface.class);
        Map<String, Object> requestContext = ((BindingProvider)sayHello).getRequestContext();

        requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8888/webservice/helloworld?wsdl");

        Map<String, List<String>> requestHeaders = new HashMap<String, List<String>>();
        requestHeaders.put("username", Collections.singletonList("nikos"));
        requestHeaders.put("Password", Collections.singletonList("superpassword"));
        requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);

        System.out.println(sayHello.getHelloWorldAsString("- This is Java Code Geeks"));

    }
}
3 голосов
/ 27 августа 2011

WS-Security предоставляет стандартный способ защиты веб-сервисов на основе SOAP, а в политике WS-Security говорится, как донести эти требования безопасности до внешнего мира.

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

Поскольку вы работаете на Java, вы можете использовать открытый исходный код Сервер приложений WSO2 для развертывания службы, и с помощью нескольких щелчков мыши вы можете обезопасить ее.

Это дополнительно объясняет, как это сделать ...

Спасибо ...

2 голосов
/ 23 июля 2011

Здесь является хорошим примером для веб-сервиса через JAX-WS с аутентификацией

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...