用例:我们有现有的生产API。我们打算将API经理用作传递调解员,以利用现有API的节流和分析。
我们编写了一个自定义身份验证处理程序,该处理程序已加载默认APIAuthenticationHandler
的上游。这使我们可以通过自定义标头X-Auth-Token
识别用户,而不是WSO2 OAuth令牌 - 此部分适用于身份验证的路线。
不幸的是,这不允许我们识别访问我们的身份验证路线的用户,结果我们的分析数据与许多"未知"用户偏斜。
我一直在尝试如何在我们的自定义身份验证处理程序中访问用户登录的HTTP POST参数,但是我无法为我的一生中的一生中的一生存储在类中。
在线各种建议,例如通过
访问httpservletrequestHttpServletRequest servletRequest = (HttpServletRequest) messageContext.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST);
不起作用。
参数在MessageContext或Axis2MessageContext对象中不可用。
log_in_message.xml
调解人记录包含我所需参数的肥皂信封:
Envelope: <?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Body>
<xformValues>
<api_key>*expunged*</api_key>
<login_id>testy.user</login_id>
</xformValues>
</soapenv:Body>
</soapenv:Envelope> {org.apache.synapse.mediators.builtin.LogMediator}
但是在我的自定义处理程序中,消息上下文中只有一个空的肥皂:
[PassThru] <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body/></soapenv:Envelope>
我也无法找到一个明显的中介模式,可以将API的突触序列添加到MessageContext中的属性中。我在网上发现的所有内容都涉及动态添加参数。
所讨论的请求是HTTP 1.1帖子(内容类型X-WWW-Form编码(,并通过下游服务成功处理,因此绝对包括参数。
任何人都可以提出一种方法,我可以从中介树中的Java类或自定义处理程序中的Java类中获得HTTP帖子的身体或身体参数?
谢谢
编辑:对于将来来到这段时间的人来说,事实证明,它就像在我的处理程序中调用调解人一样简单:
public boolean handleRequest(MessageContext messageContext) {
...
// mediate
// In order to avoid a remote registry call occurring on each invocation, we
// directly get the extension sequences from the local registry.
Map localRegistry = messageContext.getConfiguration().getLocalRegistry();
// run inbound mediations
String apiName = (String) messageContext.getProperty(RESTConstants.SYNAPSE_REST_API);
Object sequence = localRegistry.get(apiName + "--In");
if (sequence instanceof Mediator) {
((Mediator) sequence).mediate(messageContext);
}
编辑2:一个更好的解决方案是由下面的蜜蜂付诸实践的:
private String getLoginIdFromSoapEnvelope(org.apache.axis2.context.MessageContext axis2MessageContext) {
String loginId = null;
try {
RelayUtils.buildMessage(axis2MessageContext);
SOAPEnvelope envelope = axis2MessageContext.getEnvelope();
OMElement root = envelope.getBody().getFirstElement();
OMElement loginElement = root.getFirstChildWithName(new QName("login_id"));
loginId = loginElement != null ? loginElement.getText() : null;
}catch (Exception exc) {
log.error("Unable to unmarshal via RelayUtils.buildMessage", exc);
}
return loginId;
}
尝试这个。
RelayUtils.buildMessage(mc);
String login_id = mc.getEnvelope().getBody().getFirstElement()
.getFirstChildWithName(new QName("http://ws.apache.org/ns/synapse", "login_id"))
.getText();
(这可能需要一些调整..-对于名称空间等(
(参考:https://docs.wso2.com/display/esb500/sample 380: writer your your custom custom mediation in in jjava