我在服务器上部署了REST服务,并希望通过WSO2 ESB公开它(代理它)并使用ESB安全性来保护对服务的访问(可能是在ESB用户数据库中按用户名和密码查找的HTTP BASIC身份验证) ) . 我找不到描述如何做的好文档 . 这可以使用WSO2 ESB完成吗?
您可以参考this博客文章来创建REST服务的代理 . 为了保护服务,有关于如何保护服务的文章 . 这是one这样的 .
我正在添加一个新的link来保护REST服务 .
您可以将REST API用于此目的,使用wso2 ESB 4.0.2,它随附REST API,您可以轻松地调用它们,您可以全面了解REST API如何在WSO2 ESB中进行参考REST API Article
对于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; }
}
3 回答
您可以参考this博客文章来创建REST服务的代理 . 为了保护服务,有关于如何保护服务的文章 . 这是one这样的 .
我正在添加一个新的link来保护REST服务 .
您可以将REST API用于此目的,使用wso2 ESB 4.0.2,它随附REST API,您可以轻松地调用它们,您可以全面了解REST API如何在WSO2 ESB中进行参考REST API Article
对于http基本的Authenticathion,用户形式为wso2-esb,我使用这些序列 .
org.wso2.security.HttpBasicAuthOpMediator的代码(wso2-esb 4.9.0)
}