How to set tenant to header in mediator with WSO2 API Manager

自作多情 提交于 2019-12-10 03:43:57

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!