Wso2 WSO APIM 2.1.0-如何在请求中访问HTTP POST参数

Wso2 WSO APIM 2.1.0-如何在请求中访问HTTP POST参数,wso2,wso2-am,Wso2,Wso2 Am,用例:我们有一个现有的生产API。我们打算使用API Manager作为传递中介,以便在现有API上利用节流和分析 我们已经编写了一个自定义身份验证处理程序,它加载在默认的apauthenticationhandler的上游。这允许我们通过自定义头X-Auth-Token来识别用户,而不是WSO2 OAuth Token-这一部分在经过身份验证的路由中运行良好 不幸的是,这不允许我们识别访问我们的身份验证路径的用户,结果是我们的分析数据被许多“未知”用户扭曲 我一直在试图找出如何在自定义身份验证

用例:我们有一个现有的生产API。我们打算使用API Manager作为传递中介,以便在现有API上利用节流和分析

我们已经编写了一个自定义身份验证处理程序,它加载在默认的apauthenticationhandler的上游。这允许我们通过自定义头
X-Auth-Token
来识别用户,而不是WSO2 OAuth Token-这一部分在经过身份验证的路由中运行良好

不幸的是,这不允许我们识别访问我们的身份验证路径的用户,结果是我们的分析数据被许多“未知”用户扭曲

我一直在试图找出如何在自定义身份验证处理程序中访问用户登录的HTTP POST参数,但我一直无法找出Synapse在类树中的存储位置

各种在线建议,例如通过访问HttpServletRequest

HttpServletRequest servletRequest = (HttpServletRequest) messageContext.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST);
不工作

这些参数在MessageContext或Axis2MessageContext对象中不能作为属性使用

log\u in_message.xml
mediator记录包含所需参数的SOAP信封:

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}
编辑2:Bee建议的更好的解决方案如下:

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();
(这可能需要一些调整…-对于名称空间等)


Ref:

信封对象是自定义处理程序中的一条空SOAP消息。我正在考虑是否可以调用中介作为处理程序调用的一部分,因为在正常的请求流中,中介似乎在处理程序之后执行。编辑:成功了。无论如何谢谢你!我认为您应该在访问主体之前明确构建消息<代码>RelayUtils.buildMessage(mc)更新了我的答案。好的,这对我们的堆栈进行了一些修改。非常感谢,我自己也不会想到这个。很高兴听到这个。
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();