Apply plugin in gateway group level #337

This commit is contained in:
hongqiaowei
2021-10-13 15:20:43 +08:00
parent 81341bd62e
commit 815ad7a32c
6 changed files with 111 additions and 45 deletions

View File

@@ -28,18 +28,19 @@ import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
import we.plugin.FixedPluginFilter;
import we.plugin.FizzPluginFilterChain;
import we.plugin.PluginConfig;
import we.plugin.auth.ApiConfig;
import we.plugin.auth.AuthPluginFilter;
import we.plugin.auth.GatewayGroupService;
import we.plugin.stat.StatPluginFilter;
import we.proxy.Route;
import we.util.ReactorUtils;
import we.util.Result;
import we.util.ThreadContext;
import we.util.WebUtils;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.function.Function;
/**
@@ -57,10 +58,13 @@ public class PreprocessFilter extends FizzWebFilter {
private static final FilterResult succFr = FilterResult.SUCCESS(PREPROCESS_FILTER);
@Resource(name = StatPluginFilter.STAT_PLUGIN_FILTER)
private StatPluginFilter statPluginFilter;
private StatPluginFilter statPluginFilter;
@Resource(name = AuthPluginFilter.AUTH_PLUGIN_FILTER)
private AuthPluginFilter authPluginFilter;
private AuthPluginFilter authPluginFilter;
@Resource
private GatewayGroupService gatewayGroupService;
@Override
public Mono<Void> doFilter(ServerWebExchange exchange, WebFilterChain chain) {
@@ -78,16 +82,18 @@ public class PreprocessFilter extends FizzWebFilter {
.thenReturn(ReactorUtils.Void)
.flatMap(
v -> {
Result<ApiConfig> authRes = (Result<ApiConfig>) WebUtils.getFilterResultDataItem(exchange, AuthPluginFilter.AUTH_PLUGIN_FILTER, AuthPluginFilter.RESULT);
if (authRes.code == Result.FAIL) {
return WebUtils.responseError(exchange, HttpStatus.FORBIDDEN.value(), authRes.msg);
Result<ApiConfig> auth = (Result<ApiConfig>) WebUtils.getFilterResultDataItem(exchange, AuthPluginFilter.AUTH_PLUGIN_FILTER, AuthPluginFilter.RESULT);
if (auth.code == Result.FAIL) {
return WebUtils.responseError(exchange, HttpStatus.FORBIDDEN.value(), auth.msg);
}
ApiConfig ac = authRes.data;
ApiConfig ac = auth.data;
if (ac == null) {
afterAuth(exchange, null, null);
return executeFixedPluginFilters(exchange).thenReturn(ReactorUtils.Void).flatMap(checkDirectRespOrChainFilter(exchange, chain));
}
Route route = ac.getRoute(exchange);
List<PluginConfig> gatewayGroupPluginConfigs = gatewayGroupService.get(ac.firstGatewayGroup).pluginConfigs;
Route route = ac.getRoute(exchange, gatewayGroupPluginConfigs);
eas.put(WebUtils.ROUTE, route);
afterAuth(exchange, ac, route);
@@ -95,7 +101,7 @@ public class PreprocessFilter extends FizzWebFilter {
executeFixedPluginFilters(exchange).thenReturn(ReactorUtils.Void)
.flatMap(
e -> {
if (CollectionUtils.isEmpty(route.pluginConfigs)) {
if (route.pluginConfigs.isEmpty()) {
return checkDirectRespOrChainFilter(exchange, chain).apply(ReactorUtils.NULL);
} else {
eas.put(FizzPluginFilterChain.WEB_FILTER_CHAIN, chain);
@@ -107,6 +113,7 @@ public class PreprocessFilter extends FizzWebFilter {
);
}
// ?
private void afterAuth(ServerWebExchange exchange, ApiConfig ac, Route route) {
String bs = null, bp = null;
if (ac == null) {

View File

@@ -28,17 +28,18 @@ import java.util.Map;
* @author hongqiaowei
*/
public class PluginConfig {
public class PluginConfig implements Comparable<PluginConfig> {
public static final String CUSTOM_CONFIG = "fcK";
public String plugin; // tb_plugin.eng_name
public String plugin; // tb_plugin.eng_name
public String fixedConfig;
public String fixedConfig;
public Map<String/*tb_api_plugin_config.item*/, Object/*tb_api_plugin_config.value*/> config = Collections.emptyMap();
public Map<String, Object> config = Collections.emptyMap();
public int order;
// @JsonProperty(value = "config", access = JsonProperty.Access.WRITE_ONLY)
public void setConfig(String confJson) {
if (StringUtils.isNotBlank(confJson)) {
Map m = JacksonUtils.readValue(confJson, Map.class);
@@ -63,4 +64,9 @@ public class PluginConfig {
public String toString() {
return JacksonUtils.writeValueAsString(this);
}
@Override
public int compareTo(PluginConfig that) {
return this.order - that.order;
}
}

View File

@@ -29,9 +29,8 @@ import we.util.JacksonUtils;
import we.util.UrlTransformUtils;
import we.util.WebUtils;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import javax.annotation.Nullable;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -72,9 +71,14 @@ public class ApiConfig {
@JsonProperty(
access = JsonProperty.Access.WRITE_ONLY
)
public int isDeleted = 0; // tb_api_auth.is_deleted
public int isDeleted = 0; // tb_api_auth.is_deleted
public Set<String> gatewayGroups = Stream.of(GatewayGroup.DEFAULT).collect(Collectors.toSet());
public Set<String> gatewayGroups = Stream.of(GatewayGroup.DEFAULT).collect(Collectors.toCollection(LinkedHashSet::new));
@JsonProperty(
access = JsonProperty.Access.WRITE_ONLY
)
public String firstGatewayGroup;
public String service;
@@ -85,29 +89,29 @@ public class ApiConfig {
)
public HttpMethod method;
public Object fizzMethod = ALL_METHOD;
public Object fizzMethod = ALL_METHOD;
public String path = match_all;
public String path = match_all;
@JsonProperty(
access = JsonProperty.Access.WRITE_ONLY
)
public boolean exactMatch = false;
public boolean exactMatch = false;
public String backendPath;
@JsonProperty("proxyMode")
public byte type = Type.SERVICE_DISCOVERY;
public byte type = Type.SERVICE_DISCOVERY;
private int counter = 0;
private int counter = 0;
public List<String> httpHostPorts;
public char access = ALLOW;
public char access = ALLOW;
public List<PluginConfig> pluginConfigs;
public List<PluginConfig> pluginConfigs = Collections.emptyList();
public boolean checkApp = false;
public boolean checkApp = false;
public CallbackConfig callbackConfig;
@@ -119,11 +123,11 @@ public class ApiConfig {
public String rpcGroup;
public long timeout = 0;
public long timeout = 0;
public int retryCount = 0;
public int retryCount = 0;
public long retryInterval = 0;
public long retryInterval = 0;
public static boolean isAntPathPattern(String path) {
boolean uriVar = false;
@@ -154,6 +158,7 @@ public class ApiConfig {
}
);
}
firstGatewayGroup = gatewayGroups.iterator().next();
}
public void setPath(String p) {
@@ -220,7 +225,7 @@ public class ApiConfig {
return false;
}
public Route getRoute(ServerWebExchange exchange) {
public Route getRoute(ServerWebExchange exchange, @Nullable List<PluginConfig> gatewayGroupPluginConfigs) {
ServerHttpRequest request = exchange.getRequest();
Route r = new Route().type( this.type)
.method( request.getMethod())
@@ -236,7 +241,16 @@ public class ApiConfig {
.retryCount( this.retryCount)
.retryInterval( this.retryInterval);
r.pluginConfigs = this.pluginConfigs;
if (gatewayGroupPluginConfigs == null || gatewayGroupPluginConfigs.isEmpty()) {
r.pluginConfigs = this.pluginConfigs;
} else {
List<PluginConfig> pcs = new ArrayList<>(gatewayGroupPluginConfigs.size() + this.pluginConfigs.size());
pcs.addAll(gatewayGroupPluginConfigs);
pcs.addAll(this.pluginConfigs);
pcs.sort(null);
r.pluginConfigs = pcs;
}
if (this.type == Type.REVERSE_PROXY) {
r = r.nextHttpHostPort(getNextHttpHostPort());
}

View File

@@ -20,11 +20,10 @@ package we.plugin.auth;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import we.plugin.PluginConfig;
import we.util.JacksonUtils;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.*;
/**
* @author hongqiaowei
@@ -38,15 +37,17 @@ public class GatewayGroup {
public static final int DELETED = 1;
public int id;
public int id;
public int isDeleted = 0;
public int isDeleted = 0;
public String group;
public String group;
public String name;
public String name;
public Set<String> gateways = new HashSet<>();
public Set<String> gateways = new HashSet<>();
public List<PluginConfig> pluginConfigs = Collections.emptyList();
public void setGateways(String gateways) {
if (StringUtils.isNotBlank(gateways)) {

View File

@@ -209,4 +209,8 @@ public class GatewayGroupService {
}
return false;
}
public GatewayGroup get(String gg) {
return gatewayGroupMap.get(gg);
}
}