2012-09-12 14 views
10

Ho un servizio REST distribuito su un server e vorrei esporlo (proxy) tramite WSO2 ESB e utilizzare la sicurezza ESB per proteggere l'accesso al servizio (probabilmente l'autenticazione HTTP BASIC che sembra per username e password nel database degli utenti ESB). Non riesco a trovare una buona documentazione che descrive come farlo. Questo potrebbe essere fatto usando ESSO WSO2 e come?REST TO REST utilizzando WSO2 ESB

risposta

4

È possibile fare riferimento al post del blog this per la creazione del proxy per il servizio REST. Per proteggere il servizio sono disponibili articoli su come proteggere i servizi. questo è one tale.

Sto aggiungendo un nuovo link per la protezione dei servizi REST.

+0

Grazie per la risposta. Il post sul blog sulla sicurezza sta descrivendo il profilo di sicurezza UsernameToken che è per WS ma non per i servizi REST. –

+0

Spero che il nuovo collegamento per "Autorizzazione a grana fine ai servizi RESTful con XACML" possa fornire alcuni suggerimenti utili. –

+0

L'esempio del nuovo collegamento funziona con usernameToken security o devo usare XACML? – Ivo

1

È possibile utilizzare REST API per questo scopo, con WSO2 ESB 4.0.2 in poi è fornito con REST API, dove si può facilmente richiamare, è possibile ottenere una comprensione completa su come l'involoves REST API di WSO2 ESB rif REST API Article

1

Per http basic Authenticathion con utenti modulo wso2-esb io uso questa sequenza.

<sequence xmlns="http://ws.apache.org/ns/synapse" name="ValidacionHttpBasica"> 
<property name="isAuthorized" value="0" scope="default" type="STRING"/> 
<class name="org.wso2.security.HttpBasicAuthOpMediator"/> 
<switch source="get-property('isAuthorized')"> 
    <case regex="0"> 
     <property name="HTTP_SC" value="401" scope="axis2" type="STRING"/> 
     <makefault version="soap11"> 
      <code xmlns:soap11Env="http://schemas.xmlsoap.org/soap/envelope/" value="soap11Env:Server"/> 
      <reason value="Not Authorized"/> 
      <role/> 
     </makefault> 
     <respond/> 
    </case> 
    <default/> 
</switch> 
</sequence> 

Il codice per l'org.wso2.security.HttpBasicAuthOpMediator (WSO2 ESB-4.9.0)

package org.wso2.security; 

import java.util.HashMap; 
import java.util.Map; 

import org.apache.commons.codec.binary.Base64; 
import org.apache.log4j.Logger; 
import org.apache.synapse.MessageContext; 
import org.apache.synapse.core.axis2.Axis2MessageContext; 
import org.apache.synapse.mediators.AbstractMediator; 
import org.wso2.carbon.context.CarbonContext; 
import org.wso2.carbon.user.api.UserStoreException; 

public class HttpBasicAuthOpMediator extends AbstractMediator { 

private static final Logger LOGGER = Logger.getLogger(HttpBasicAuthOpMediator.class); 


/* (non-Javadoc) 
* @see org.apache.synapse.Mediator#mediate(org.apache.synapse.MessageContext) 
*/ 
public boolean mediate(MessageContext msgctx) { 

    boolean isOK = true; 

    try { 

     //trazearDatos(msgctx); 
     org.apache.axis2.context.MessageContext axis2MessageContext = ((Axis2MessageContext) msgctx) 
       .getAxis2MessageContext(); 
     Map<String,String> mHeaders = (Map<String,String>)axis2MessageContext.getProperty("TRANSPORT_HEADERS"); 


     // 1 - Validacion de cabeceras de seguridad 
     String securityHeader = mHeaders.get("Authorization"); 
     if (securityHeader==null || securityHeader.trim().length()<7) { 
      throw new RuntimeException ("Request sin cabecera de Autorizacion"); 
     } 

     // 2 - Validacion de usuario-contrasenya 
     String user = validarUsuario(securityHeader); 

     // 3 - validacion de operacion asociada a un rol 
     if (msgctx.getProperty("SECURITY_OPERATION")!=null && msgctx.getProperty("SECURITY_OPERATION").toString().equalsIgnoreCase("1")) { 
      validarOperacion(user, mHeaders.get("SOAPAction"), msgctx); 
     } 

     // todo ha ido bien, esta autorizado 
     msgctx.setProperty("isAuthorized", "1"); 

    } catch (Exception e) { 
     LOGGER.info("ERROR VALIDACION USUARIO ..." + e.getMessage()); 
     //isOK = false; 
    } 

    return isOK; 
} 



/** 
* Comprueba que el usuario tiene los roles asociados a la operacion. 
* Si el usuario no tiene los roles, lanza un runtimeExcpetion 
* @param operacion, que se obtiene del soapAction de la cabecera http 
* @param messageContext 
*/ 
private void validarOperacion(String user, String operacion, MessageContext messageContext) { 

    operacion = operacion.replaceAll("\"", ""); 
    operacion = operacion.replaceAll("'", ""); 
    //obtener los roles asociados a la operacion 
    if (messageContext.getProperty("SECURITY_OPERATION_" + operacion)!= null) { 
     boolean existeRol = false; 
     try { 
      String[] rolesOperation = messageContext.getProperty("SECURITY_OPERATION_" + operacion).toString().split(","); 
      Map<String,String> mRolesUser = toMap(CarbonContext.getThreadLocalCarbonContext().getUserRealm().getUserStoreManager().getRoleListOfUser(user)); 

      for (String rol : rolesOperation) { 
       if (mRolesUser.containsKey(rol)) { 
        existeRol = true; 
        break; 
       } 
      } 
      if (!existeRol) { 
       throw new RuntimeException("Usuario sin role para ejecutar operacion"); 
      } 
     } catch (Exception e) { 
      throw new RuntimeException("ValidaRoleOperacion:" + e.getMessage()); 
     } 
    } 


} 



/** 
* Valida si la cabecera contiene un usuario-contrsenya valido en wso2. 
* Si no lo encuentra lanza un RuntimeExpception. 
* @param cabecera http-header que contiene el usuario-contrsenya en base64. 
*/ 
private String validarUsuario(String cabecera) { 

    String credentials = cabecera.substring(6).trim(); 
    String decodedCredentials = new String(new Base64().decode(credentials.getBytes())); 
    String userName = decodedCredentials.split(":")[0]; 
    String password = decodedCredentials.split(":")[1]; 

    //CarbonContext ctx = CarbonContext.getCurrentContext(); 
    CarbonContext ctx = CarbonContext.getThreadLocalCarbonContext(); 

    try { 
     if (!ctx.getUserRealm().getUserStoreManager().authenticate(userName, password)) { 
      throw new RuntimeException("Usuario-contrasenya incorrecto"); 
     } 
    } catch (UserStoreException e) { 
     throw new RuntimeException("UserStoreException:" + e.getMessage()); 
    } 
    return userName; 
} 



public void trazearDatos(MessageContext msgctx) { 

    try { 

    System.out.println("....INICIO_TRAZEO DATOS..............."); 
    // CABECERAS HTTP para pbtener operacion, user-password. Es un Map<String, String> 
    if (msgctx.getProperty("TRANSPORT_HEADERS") != null) { 
     Map<String,String> mHeaders = (Map<String,String>)msgctx.getProperty("TRANSPORT_HEADERS"); 
     for (String key:mHeaders.keySet()) { 
      System.out.println("HEADER_HTTP..." + key + "==" + mHeaders.get(key)); 
     } 
    } else { 
     System.out.println("Es nulo TRANSJPPORT_HEADER, casteamos"); 
     org.apache.axis2.context.MessageContext axis2MessageContext = ((Axis2MessageContext) msgctx) 
       .getAxis2MessageContext(); 
     Map<String,String> mHeaders = (Map<String,String>)axis2MessageContext.getProperty("TRANSPORT_HEADERS"); 
     for (String key:mHeaders.keySet()) { 
      System.out.println("(cast) HEADER_HTTP..." + key + "==" + mHeaders.get(key)); 
     } 
    } 

    // PROPERTIES DEL MESSAGE_CONTEXT 
    String keyMC; 
    for (Object keyObject : msgctx.getPropertyKeySet()) { 
     keyMC = (String)keyObject; 
     System.out.println("PROPERTIES_CONTEXT..." + keyMC + "==" + msgctx.getProperty(keyMC)); 
    } 


    // pintamos los roles que tiene asignado el usuario 
    CarbonContext carbonctx = CarbonContext.getThreadLocalCarbonContext(); 

    String[] roles = carbonctx.getUserRealm().getUserStoreManager().getRoleNames(); 
    for(String role:roles) { 
     System.out.println("ROLE_WSO2..." + role); 
    } 
    System.out.println("....FIN_TRAZEO DATOS..............."); 

    } catch (Exception e) { 
     LOGGER.debug("ERROR TRAZEANDO DATOS VALIDACION USER:" + e.getMessage()); 
    } 

} 

private Map<String,String> toMap(String[] array) { 
    Map<String,String> mapa = new HashMap<String,String>(); 
    if (array!=null) { 
     for (String val : array) { 
      mapa.put(val, val); 
     } 
    } 
    return mapa; 
} 

}

Problemi correlati