首页 文章

使用WSO2 ESB REST REST

提问于
浏览
10

我在服务器上部署了REST服务,并希望通过WSO2 ESB公开它(代理它)并使用ESB安全性来保护对服务的访问(可能是在ESB用户数据库中按用户名和密码查找的HTTP BASIC身份验证) ) . 我找不到描述如何做的好文档 . 这可以使用WSO2 ESB完成吗?

3 回答

  • 1

    您可以参考this博客文章来创建REST服务的代理 . 为了保护服务,有关于如何保护服务的文章 . 这是one这样的 .

    我正在添加一个新的link来保护REST服务 .

  • 4

    您可以将REST API用于此目的,使用wso2 ESB 4.0.2,它随附REST API,您可以轻松地调用它们,您可以全面了解REST API如何在WSO2 ESB中进行参考REST API Article

  • 1

    对于http基本的Authenticathion,用户形式为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;
    }
    

    }

相关问题