You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSO2 EI 6.6.0如何通过Synapse handler识别入站请求认证类型

WSO2 EI 6.6.0 入站认证类型判定及日志问题解决方案

WSO2 EI 6.6.0 没有提供直接标记preemptive/nonpreemptive认证类型的专属属性,可通过请求特征+Axis2上下文内置属性组合,在Synapse Handler中完成准确判定,同时可以通过前置拦截解决无认证头导致的错误日志问题。

认证类型判定规则

在Synapse Handler的handleRequestInFlow阶段可直接读取请求上下文做判断:

  • 抢占式(Preemptive)认证判定:客户端首次发起请求时就携带非空的Authorization传输头,请求经过认证链校验通过后,Axis2上下文中的AUTHENTICATION_CONTEXT属性会被写入非空值,同时不会触发401挑战响应,满足以上特征即可判定为抢占式认证。
  • 非抢占式(Non-preemptive)认证判定:客户端首次发起请求时不携带Authorization传输头,上下文不存在有效AUTHENTICATION_CONTEXT属性,服务端会返回401状态码+WWW-Authenticate响应头触发认证挑战;客户端收到401后发起的第二次请求会携带认证信息,该请求可通过自定义的会话关联标记(比如请求ID、客户端IP+接口路径的短时间缓存标记)和前一次401请求做关联,判定为非抢占式认证的校验请求。

无Authorization头错误日志解决方法

将自定义Synapse Handler的执行优先级设置高于系统默认认证Handler,在请求流入的最前端增加前置拦截逻辑,避免无认证头的请求进入默认认证链抛出错误日志,核心实现代码如下:

// 提取Axis2级别的消息上下文和传输头
org.apache.axis2.context.MessageContext axis2MsgContext = ((org.apache.synapse.core.axis2.Axis2MessageContext) synapseContext).getAxis2MessageContext();
Map<String, String> transportHeaders = (Map<String, String>) axis2MsgContext.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
String authorizationHeader = transportHeaders.get("Authorization");

// 无有效认证头时直接返回401挑战,终止后续流程
if (authorizationHeader == null || authorizationHeader.trim().isEmpty()) {
    transportHeaders.put("WWW-Authenticate", "Basic realm=\"WSO2 EI Service Realm\"");
    synapseContext.setProperty(org.apache.synapse.MessageContext.RESPONSE, true);
    org.apache.axis2.context.MessageContext outMsgContext = MessageContextBuilder.createOutMessageContext(axis2MsgContext);
    outMsgContext.setProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS, transportHeaders);
    outMsgContext.setProperty(org.apache.axis2.context.MessageContext.HTTP_STATUS_CODE, 401);
    org.apache.synapse.core.axis2.Axis2Sender.sendBack(synapseContext);
    return false;
}

适配说明

  • 如果使用OAuth2、Digest认证等非Basic认证模式,仅需要修改WWW-Authenticate响应头的取值,匹配对应协议要求即可
  • 如果开启了HTTPS双向认证,将Authorization头的非空校验逻辑替换为javax.servlet.request.X509Certificate上下文属性的非空校验即可,其余逻辑不变
  • 上述逻辑无需修改WSO2 EI核心配置,自定义Handler打包为OSGi bundle部署到dropins目录即可生效

内容的提问来源于stack exchange,提问作者jakub.voves

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:24:28