2011-07-23 80 views

Respuesta

6

Probablemente el mejor pero más complejo es WS-Security con varios métodos de autenticación. Pero es más complejo y es bueno para el entorno empresarial. Le permite crear auth de extremo a extremo y hay muchas opciones. Puedes hacerlo en caso simple, por ej. utilizar Web Services 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> 

No sé qué biblioteca se utiliza, pero aquí es un buen artículo how to install Rampart into Axis2 and implement UsernameToken handling.

Pero en algunos casos simplificados, simplemente puede hacer Autenticación HTTP básica al servidor web (a través de SSL). Esta puede ser la peor solución, pero a veces podría ser más fácil de implementar. Otra solución, que no está relacionada con el jabón, puede ser SSL mutuamente autenticado (con autorización del cliente).

2

Here es un buen ejemplo de un servicio web a través de JAX-WS con autentificación

3

WS-Security proporciona la forma estándar para asegurar los servicios web basados ​​en SOAP y WS-Security Política dice cómo comunicar los requisitos de seguridad a lado de la salida mundo.

La autenticación puede ser con nombre de usuario/contraseña, con nombre de usuario o certificado.

Dado que está basado en Java, puede usar el código abierto WSO2 Application Server para implementar su servicio y con pocos clics puede proteger su servicio.

This explican además cómo hacerlo ...

Gracias ...

4

diferentes formas y diferentes tipos de seguridad que podemos poner en práctica: de seguridad a nivel de mensajes

  • Transporte de nivel de seguridad: como HTTP Basic/Digest y SSL
  • Nivel de mensajes de seguridad: Tal como WS-Security, firma digital XML, cifrado XML, XKMS (X ML K ey M GESTIÓN S specificaciones), XACML (e X tensible A l acceso C ontrol M arkup L anguage), SAML (S ecure A ssertion M arkup L spain), servicio de mensajes ebXML, The Liberty Alliance Project. for more detals
  • Control de acceso de seguridad: Un rol de seguridad es un privilegio otorgado a usuarios o grupos según condiciones específicas.

más comúnmente utilizamos WS-Security para Servicios web SOAP. A WS-security profile determina cómo se habilita WS-security.

  1. WSS X.509 simbólico Perfil: utilizar el marco X.509 para un perfil de seguridad X.509 WSS.
  2. WSS UsernameToken Profile: Al especificar el Perfil del token X.509, también puede proporcionar un UsernameToken en la solicitud SOAP.

ejemplo:

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

El elemento anterior incluye en encabezado SOAP como sigue:

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

El siguiente ejemplo es simple usuario añadir y contraseña para cabecera HTTP solamente.

de autenticación de la aplicación con JAX-WS usando WebServiceContext interfaz

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

    } 
} 
Cuestiones relacionadas