登录 soul-admin,开启 waf 插件。
官网上的这两句很重要,waf 插件源码的实现也是根据这两句话来的。
- 当 module 设置为 black 模式的时候,只有匹配的流量才会执行拒绝策略,不匹配的,直接会跳过。
- 当 module 设置为 mixed 模式的时候,所有的流量都会通过 waf插件,针对不同的匹配流量,用户可以设置是 拒绝,还是通过。
一开始我选的 black 模式,配置如下。
请求时,就是这样的。
接下来看下源码是怎么实现的。
waf 插件是前置插件,也就是在请求真正 url 之前进行的,在插件链上第三个执行的。执行 waf 插件时,AbstractSoulPlugin 会匹配选择器和规则,匹配成功后,在 WafPlugin 会执行 doExecute 方法。
但 waf 插件比较特殊一点是,其他插件规则匹配不成功,一般就是走下一个插件了,AbstractSoulPlugin 的 handleSelectorIsNull,handleRuleIsNull 的代码都是这么写的
//执行下一个插件
protected Mono<Void> handleSelectorIsNull(final String pluginName, final ServerWebExchange exchange, final SoulPluginChain chain) {
return chain.execute(exchange);
}
protected Mono<Void> handleRuleIsNull(final String pluginName, final ServerWebExchange exchange, final SoulPluginChain chain) {
return chain.execute(exchange);
}
但 wafPlugin 重写了 handleSelectorIsNull 和 handleRuleIsNull 方法,即使匹配不到选择器和规则,只要你 waf 插件开启了,也会走到 wafPlu