2012-09-12 20 views
10

का उपयोग करके REST को रीस्ट करने के लिए मेरे पास एक सर्वर पर एक आरईएसटी सेवा तैनात है और इसे डब्लूएसओ 2 ईएसबी के माध्यम से (प्रॉक्सी) का खुलासा करना है और सेवा तक पहुंच सुरक्षित करने के लिए ईएसबी सुरक्षा का उपयोग करना चाहते हैं (शायद HTTP मूल प्रमाणीकरण जो दिखता है ईएसबी उपयोगकर्ता डेटाबेस में उपयोगकर्ता नाम और पासवर्ड द्वारा)। मुझे यह बताते हुए एक अच्छा प्रलेखन नहीं मिल रहा है कि यह कैसे करें। क्या यह डब्लूएसओ 2 ईएसबी का उपयोग करके किया जा सकता है और कैसे?WSO2 ESB

उत्तर

4

आप आरईएसटी सेवा के लिए प्रॉक्सी बनाने के लिए this ब्लॉग पोस्ट देख सकते हैं। सेवा को सुरक्षित करने के लिए सेवाओं को सुरक्षित करने के तरीके पर लेख हैं। यह one है।

मैं आरईएसटी सेवाओं को सुरक्षित करने के लिए एक नया link जोड़ रहा हूं।

+0

उत्तर के लिए धन्यवाद के लिए कोड। सुरक्षा के बारे में ब्लॉग पोस्ट उपयोगकर्ता नाम टोकन सुरक्षा प्रोफाइल का वर्णन कर रहा है जो डब्ल्यूएस के लिए है लेकिन आरईएसटी सेवाओं के लिए नहीं है। –

+0

मुझे उम्मीद है कि "एक्सएसीएमएल के साथ रीस्टफुल सर्विसेज टू फाइन-ग्रेनेड प्राधिकरण" के लिए नया लिंक आपको कुछ उपयोगी संकेत देगा। –

+0

उपयोगकर्ता लिंक टोकन सुरक्षा के साथ नए लिंक काम का उदाहरण होगा या मुझे XACML का उपयोग करना होगा? – Ivo

1

आप, ESB 4.0.2 इस उद्देश्य के लिए REST API का उपयोग कर सकते हैं WSO2 साथ आगे यह REST API साथ जहाजों जहां आप आसानी से उन्हें आह्वान कर सकते हैं, तो आप WSO2 ESB रेफरी में कैसे REST API involoves पर एक व्यापक समझ प्राप्त कर सकते हैं REST API Article

1

उपयोगकर्ताओं के साथ http मूल प्रमाणीकरण के लिए wso2-esb मैं इन अनुक्रमों का उपयोग करता हूं।

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

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

}