How to set tenant to header in mediator with WSO2 API Manager
I have an API that requires the tenant as a header.
If I create a custom in-sequence:
<sequence name="WSO2AM--Ext--In">
<header
name="X-Tenant-Id"
scope="transport"
action="set"
expression="???????????????????"
/>
</sequence>
Is there an expression that I can use to achieve this? Or should I resort to creating a per-API mediator to set it?
PS: Looking at WSO2 source code (CarbonTenantInfoConfigurator.java), I found this fragment that could be useful as a hint:
PrivilegedCarbonContext cc = PrivilegedCarbonContext.getThreadLocalCarbonContext();
String tenantDomain = cc.getTenantDomain();
int tenantId = cc.getTenantId();
messageContext.setProperty("tenant.info.domain", tenantDomain);
messageContext.setProperty("tenant.info.id", tenantId);
But I don't know how to access to those properties in the custom sequence, if possible.
After checking the debug output from ApiManager, I noticed that custom sequences are being executed right after handlers. Luckily, the OAuthAuthenticator class (used by APIAuthenticationHandler) sets some handy properties like END_USER_NAME
and APPLICATION_NAME
.
END_USER_NAME
contains the name and tenant of the caller (user@tenant.com).
This custom sequence worked for 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>
I could not find documentation for the property other than source code and this other question
As the code suggests these are set to synapse MessageContext. You can retrieve these properties using following expressions.
get-property('tenant.info.domain')
get-property('tenant.info.id')
Thanks
Tishan
链接地址: http://www.djcxy.com/p/28406.html