问题
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.
回答1:
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
回答2:
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
来源:https://stackoverflow.com/questions/32076003/how-to-set-tenant-to-header-in-mediator-with-wso2-api-manager