package com.kidgrow.zuul.filter;
import cn.hutool.core.collection.ConcurrentHashSet;
import com.kidgrow.common.exception.OpenSignatureException;
import com.kidgrow.common.utils.SignatureUtils;
import com.kidgrow.common.utils.WebUtils;
import com.kidgrow.zuul.config.ApiProperties;
import com.kidgrow.zuul.exception.JsonSignatureDeniedHandler;
import com.kidgrow.zuul.service.feign.BaseAppServiceClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
/**
* 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
*
* @Description: 数字验签前置过滤器
* @Project:
* @CreateDate: Created in 2020/2/4 14:49
* @Author: liuke
*/
@Slf4j
public class PreSignatureFilter extends OncePerRequestFilter {
private JsonSignatureDeniedHandler signatureDeniedHandler;
private BaseAppServiceClient baseAppServiceClient;
private ApiProperties apiProperties;
private static final AntPathMatcher pathMatch = new AntPathMatcher();
private Set signIgnores = new ConcurrentHashSet<>();
// public PreSignatureFilter(BaseAppServiceClient baseAppServiceClient, ApiProperties apiProperties, JsonSignatureDeniedHandler jsonSignatureDeniedHandler) {
// this.baseAppServiceClient = baseAppServiceClient;
// this.apiProperties = apiProperties;
// this.signatureDeniedHandler = jsonSignatureDeniedHandler;
// // 默认忽略签名
// signIgnores.add("/");
// signIgnores.add("/error");
// signIgnores.add("/favicon.ico");
// if (apiProperties != null) {
// if (apiProperties.getSignIgnores() != null) {
// signIgnores.addAll(apiProperties.getSignIgnores());
// }
// if (apiProperties.getApiDebug()) {
// signIgnores.add("/**/v2/api-docs/**");
// signIgnores.add("/**/swagger-resources/**");
// signIgnores.add("/webjars/**");
// signIgnores.add("/doc.html");
// signIgnores.add("/swagger-ui.html");
// }
// }
// }
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String requestPath = request.getRequestURI();
System.out.println(request.getHeaderNames());
//if (apiProperties.getCheckSign() && !notSign(requestPath)) {
Map params = WebUtils.getParameterMap(request);
String appid="";
//params.get("app_id").toString();
if (!SignatureUtils.validateSign(params,appid)) {
throw new OpenSignatureException("签名验证失败!");
}
//}
filterChain.doFilter(request, response);
}
protected boolean notSign(String requestPath) {
if(apiProperties.getSignIgnores()==null){
return false;
}
for (String path : signIgnores) {
if (pathMatch.match(path, requestPath)) {
return true;
}
}
return false;
}
}