サーバーにRESTサービスをデプロイしていて、WSO2 ESBを通して公開(プロキシ)し、ESBセキュリティを使用してサービスへのアクセスを保護します(おそらくHTTP基本認証ESBユーザデータベースのユーザ名とパスワードによって)。私はそれを行う方法を説明する良い文書を見つけることができません。これはWSO2 ESBを使用して行うことができますか?WSO2 ESBを使用して残りの部分を削除する
10
A
答えて
4
1
あなたは簡単にそれらを呼び出すことができREST APIを使用して4.0.2以降で発送がWSO2 ESBで、この目的のためにREST APIを使用することができます、あなたはWSO2 ESB refのREST API Article
でどのようにRESTのAPIのinvolovesの総合的な理解を得ることができます
1
ユーザーフォームwso2-esbを使用したhttpの基本認証の場合は、これらのシーケンスを使用します。
<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;
}
}
関連する問題
- 1. NN最新のエントリだけを残して残りの部分をすべて削除してください
- 2. BST削除ノードメソッドがツリーの残りの部分を切り捨てる
- 3. エラーWSO2 ESBから残りのAPIを呼び出す際に
- 4. wso2のレスポンスメッセージからContent-Typeを削除する方法ESB
- 5. WSO2 ESBのws-securityヘッダーを削除するには?
- 6. WSO2でのWSO2の使用方法ESB
- 7. mysql_queryの最初の要素を削除して残りの部分をすべて取り除く方法は?
- 8. WSO2 ESB - OAuth2サービスを使用する
- 9. WSO2でcharset = utf-8を削除する方法ESB
- 10. WSO2を使用して2つのクエリを結合するESB
- 11. MTO2を使用したWSO2 ESB WS-
- 12. WSO2 ESB - ファイルコピープロキシサービス - 使用方法?
- 13. WSO2 ESB用アダプタ
- 14. WSO2でSOAPを使用してRESTfulサービスをプロキシするESB
- 15. バッファからn番目のビットを削除し、残りの部分をシフト
- 16. wso2 esbのXpath関数を使用
- 17. JQueryを使用してデータベースの行の残りの部分を取得する
- 18. WSO2でのアプリケーションの削除ESBでコンポーネントが削除されない
- 19. wso2 esbを使用してプロパティメディエータでaction = removeを使用する方法
- 20. WSO2 ESB 4.8.1を使用してJSONスキーマ検証とジャクソンのcoreutils
- 21. AnythingsliderのStart/Stopボタンを削除したいが、ナビゲーションの残りの部分は残す
- 22. 残りのapiを使用してmarklogicでデータベースを作成/削除する
- 23. CARを使用してWSO2 ESBにカスタムメディエーターをデプロイ
- 24. WSO2 ESBコネクタを使用してサーバにISO8583メッセージを送信
- 25. esb(wso2)を使用してLotus Dominoにユーザーを追加
- 26. foreachメディエータを使用してWSO2 ESBでJSON配列を変換
- 27. WSO2 ESB 4.8.1はWSO2 ESB 4.8.1に要求
- 28. WSO2 ESB
- 29. スクリプト部分をタイムアウトして残りの部分を許可する
- 30. Sailsjs(見つかりません)APIの残りの部分は削除404
は答えをいただき、ありがとうございます。セキュリティに関するブログ記事には、WSのためのものだがRESTサービスのためのものではないUsernameTokenセキュリティプロファイルが記述されている。 –
「XACMLを使用したRESTfulサービスへのファイングレイン認可」の新しいリンクが役立つヒントを得ることを願っています。 –
新しいリンクの例がusernameTokenセキュリティで動作するか、XACMLを使用する必要がありますか? – Ivo