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
相关产品推荐
相关产品推荐

