|
@@ -0,0 +1,90 @@
|
|
|
+package com.jiayue.ssi.filter;
|
|
|
+
|
|
|
+import com.jiayue.ssi.constant.SecretKeyConstants;
|
|
|
+import com.jiayue.ssi.servlet.ParameterRequestWrapper;
|
|
|
+import com.jiayue.ssi.util.SM2CryptUtils;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.core.annotation.Order;
|
|
|
+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.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+* 验证sm过滤器
|
|
|
+*
|
|
|
+* @author xsl
|
|
|
+* @since 2023/02/27
|
|
|
+*/
|
|
|
+@Order(4)
|
|
|
+public class VerifySmFilter extends OncePerRequestFilter {
|
|
|
+ private String defaultFilterProcessUrl = "/user/login";
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
|
|
|
+ // 不是登录操作
|
|
|
+ if (!("POST".equalsIgnoreCase(request.getMethod()) && defaultFilterProcessUrl.equals(request.getServletPath()))) {
|
|
|
+ // 验证token
|
|
|
+ String tokenStr = request.getHeader("Authorization");
|
|
|
+ if (StringUtils.isNotEmpty(tokenStr)){
|
|
|
+ // 解密token
|
|
|
+ String decryptTokenStr = SM2CryptUtils.decrypt(tokenStr,SecretKeyConstants.SERVER_PRIVATE_KEY);
|
|
|
+ System.out.println("接收token后解密:"+decryptTokenStr);
|
|
|
+ String tokenSign = request.getHeader("TokenSign");
|
|
|
+ // 验证签名
|
|
|
+ boolean verifySign = SM2CryptUtils.verifySign(SecretKeyConstants.CLIENT_PUBLIC_KEY,decryptTokenStr,tokenSign);
|
|
|
+ if (!verifySign){
|
|
|
+ // 验签失败
|
|
|
+ response.addHeader("Access-Control-Allow-Origin", "*");
|
|
|
+ response.setContentType("text/html;charset=UTF-8");
|
|
|
+ response.setStatus(401);
|
|
|
+ response.getWriter().write("token验签失败,不能访问系统!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ response.addHeader("Access-Control-Allow-Origin", "*");
|
|
|
+ response.setContentType("text/html;charset=UTF-8");
|
|
|
+ response.setStatus(401);
|
|
|
+ response.getWriter().write("没有令牌权限,不能访问系统!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证加密的参数文本
|
|
|
+ String data_sm2 = request.getParameter("secretData");
|
|
|
+ String decryptStr = "";
|
|
|
+ if (StringUtils.isNotEmpty(data_sm2)){
|
|
|
+ System.out.println("接收前端加密:"+data_sm2);
|
|
|
+ decryptStr = SM2CryptUtils.decrypt(data_sm2,SecretKeyConstants.SERVER_PRIVATE_KEY);
|
|
|
+ System.out.println("解密后:" + decryptStr);
|
|
|
+ // 验签前端参数
|
|
|
+ String paramSign = request.getParameter("paramSign");
|
|
|
+ System.out.println(paramSign);
|
|
|
+ // 验证签名
|
|
|
+ boolean verifySign = SM2CryptUtils.verifySign(SecretKeyConstants.CLIENT_PUBLIC_KEY,decryptStr,paramSign);
|
|
|
+ if (!verifySign){
|
|
|
+ // 验签失败
|
|
|
+ response.addHeader("Access-Control-Allow-Origin", "*");
|
|
|
+ response.setContentType("text/html;charset=UTF-8");
|
|
|
+ response.setStatus(401);
|
|
|
+ response.getWriter().write("参数验签失败,不能访问系统!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Map<String,Object> stringToMap = new HashMap(16);
|
|
|
+ if (!"".equals(decryptStr)){
|
|
|
+ String[] tempInterval = decryptStr.split("&");
|
|
|
+ for (int i=0;i<tempInterval.length;i++){
|
|
|
+ String[] fieldKeyValue = tempInterval[i].split("=");
|
|
|
+ stringToMap.put(fieldKeyValue[0],fieldKeyValue[1]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ParameterRequestWrapper pr = new ParameterRequestWrapper(request, stringToMap);
|
|
|
+ filterChain.doFilter(pr, response);
|
|
|
+ }
|
|
|
+}
|