2015-08-18 30 views
7

Ho un'API che richiede l'inquilino come intestazione.Come impostare il titolare per l'intestazione in mediatore con WSO2 API Manager

Se creo una consuetudine in sequenza:

<sequence name="WSO2AM--Ext--In"> 
    <header 
     name="X-Tenant-Id" 
     scope="transport" 
     action="set" 
     expression="???????????????????" 
    /> 
</sequence> 

C'è un'espressione che posso usare per raggiungere questo obiettivo? O dovrei ricorrere alla creazione di un mediatore per API per impostarlo?

PS: Guardando il codice sorgente WSO2 (CarbonTenantInfoConfigurator.java), ho trovato questo frammento che potrebbe essere utile come un suggerimento:

PrivilegedCarbonContext cc = PrivilegedCarbonContext.getThreadLocalCarbonContext(); 
String tenantDomain = cc.getTenantDomain(); 
int tenantId = cc.getTenantId(); 
messageContext.setProperty("tenant.info.domain", tenantDomain); 
messageContext.setProperty("tenant.info.id", tenantId); 

Ma io non so come accedere a tali proprietà in costume sequenza, se possibile.

risposta

3

Dopo aver verificato la di debug uscita da ApiManager, ho notato che sequenze personalizzate vengono eseguite subito dopo i gestori. Fortunatamente, la classe OAuthAuthenticator (utilizzata da APIAuthenticationHandler) imposta alcune utili proprietà come END_USER_NAME e APPLICATION_NAME.

END_USER_NAME contiene il nome e il titolare del chiamante ([email protected]).

Questa sequenza personalizzata ha lavorato per me:

<sequence name="add_service_header" trace="enable" statistics="enable" xmlns="http://ws.apache.org/ns/synapse"> 
    <log/> 
    <property name="tenant" expression="fn:substring-after(get-property('END_USER_NAME'), '@')" /> 
    <header name="X-Tenant" scope="transport" expression="get-property('tenant')"/> 
    <header name="X-AppName" scope="transport" expression="get-property('APPLICATION_NAME')"/> 
</sequence> 

non riuscivo a trovare la documentazione per la proprietà diverso dal codice sorgente e this other question

+0

Questo è esattamente quello che stavo cercando e funziona benissimo. Grazie! –

0

Come suggerisce il codice, questi sono impostati su Synapse MessageContext. È possibile recuperare queste proprietà utilizzando le seguenti espressioni.

get-proprietà ('tenant.info.domain')

get-proprietà ('tenant.info.id')

Grazie

Tishan

+0

ho provato. Ho anche provato 'get-property (tenant.info.domain)', '$ ctx: tenant.info.domain' e' $ axis2: tenant.info.domain' senza successo. –

+0

Ho provato con ESB 4.8.0 e funziona come previsto. Di seguito è riportato il segmento di configurazione della sinapsi utilizzato per impostare l'intestazione HTTP.

Tishan