How to set tenant to header in mediator with WSO2

2019-04-26 15:41发布

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.

2条回答
Deceive 欺骗
2楼-- · 2019-04-26 16:36

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

查看更多
一纸荒年 Trace。
3楼-- · 2019-04-26 16:39

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

查看更多
登录 后发表回答