|
@@ -31,6 +31,8 @@ import reactor.core.publisher.Mono;
|
|
|
import javax.annotation.Resource;
|
|
import javax.annotation.Resource;
|
|
|
import java.security.NoSuchAlgorithmException;
|
|
import java.security.NoSuchAlgorithmException;
|
|
|
import java.text.ParseException;
|
|
import java.text.ParseException;
|
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
import java.util.*;
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
@@ -63,9 +65,17 @@ public class WebFluxUserRequestInfoFilter implements GlobalFilter {
|
|
|
@Value("${wxapplet.appId}")
|
|
@Value("${wxapplet.appId}")
|
|
|
private String appId;
|
|
private String appId;
|
|
|
|
|
|
|
|
|
|
+ @Value("${wxapplet.minusMinute:2}")
|
|
|
|
|
+ private Integer minusMinute;
|
|
|
|
|
+
|
|
|
|
|
+ @Value("${wxapplet.plusMinute:2}")
|
|
|
|
|
+ private Integer plusMinute;
|
|
|
|
|
+
|
|
|
@Resource
|
|
@Resource
|
|
|
private ObjectMapper objectMapper;
|
|
private ObjectMapper objectMapper;
|
|
|
|
|
|
|
|
|
|
+ private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
|
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
|
|
String wxAppletId = exchange.getRequest().getHeaders().getFirst("WxAppletId");
|
|
String wxAppletId = exchange.getRequest().getHeaders().getFirst("WxAppletId");
|
|
@@ -136,18 +146,17 @@ public class WebFluxUserRequestInfoFilter implements GlobalFilter {
|
|
|
// 把新的 exchange 放回到过滤链
|
|
// 把新的 exchange 放回到过滤链
|
|
|
return chain.filter(exchange.mutate().request(request).build());
|
|
return chain.filter(exchange.mutate().request(request).build());
|
|
|
}
|
|
}
|
|
|
- } else {
|
|
|
|
|
- // 三级等保,若小程序请求不带token,则走该校验方法
|
|
|
|
|
- if (!isEncryptedRequest(exchange.getRequest())) {
|
|
|
|
|
- exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
|
|
|
|
|
- return exchange.getResponse().setComplete();
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
return chain.filter(exchange);
|
|
return chain.filter(exchange);
|
|
|
} else {
|
|
} else {
|
|
|
try {
|
|
try {
|
|
|
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
|
|
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
|
|
|
if (Strings.isNullOrEmpty(token)) {
|
|
if (Strings.isNullOrEmpty(token)) {
|
|
|
|
|
+ // 三级等保,若小程序请求不带token,则走该校验方法
|
|
|
|
|
+ if (!isEncryptedRequest(exchange.getRequest())) {
|
|
|
|
|
+ exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
|
|
|
|
|
+ return exchange.getResponse().setComplete();
|
|
|
|
|
+ }
|
|
|
return chain.filter(exchange);
|
|
return chain.filter(exchange);
|
|
|
}
|
|
}
|
|
|
// 由于漏洞扫描发现退出登陆后,token在一定时间范围内还是有效,故此处做黑名单限制,
|
|
// 由于漏洞扫描发现退出登陆后,token在一定时间范围内还是有效,故此处做黑名单限制,
|
|
@@ -272,7 +281,16 @@ public class WebFluxUserRequestInfoFilter implements GlobalFilter {
|
|
|
private boolean isEncryptedRequest(ServerHttpRequest request) {
|
|
private boolean isEncryptedRequest(ServerHttpRequest request) {
|
|
|
String sign = request.getHeaders().getFirst("sign");
|
|
String sign = request.getHeaders().getFirst("sign");
|
|
|
String time = request.getHeaders().getFirst("time");
|
|
String time = request.getHeaders().getFirst("time");
|
|
|
- return md5(time).equals(sign);
|
|
|
|
|
|
|
+ return isValidTime(time) && md5(time).equals(sign);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private boolean isValidTime(String time) {
|
|
|
|
|
+ // 服务器前后两分钟
|
|
|
|
|
+ LocalDateTime datetime = LocalDateTime.parse(time, TIME_FORMATTER);
|
|
|
|
|
+ LocalDateTime m2t = LocalDateTime.now().minusMinutes(minusMinute);
|
|
|
|
|
+ LocalDateTime p2t = LocalDateTime.now().plusMinutes(plusMinute);
|
|
|
|
|
+ return (datetime.isAfter(m2t) || datetime.isEqual(m2t)) &&
|
|
|
|
|
+ (datetime.isBefore(p2t) || datetime.isAfter(p2t));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private String md5(String time) {
|
|
private String md5(String time) {
|