|
@@ -20,52 +20,52 @@ import java.util.HashMap;
|
|
|
import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
-* 验证sm过滤器
|
|
|
-*
|
|
|
-* @author xsl
|
|
|
-* @since 2023/02/27
|
|
|
-*/
|
|
|
+ * 验证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 {
|
|
|
- Map<String,Object> stringToMap = new HashMap(16);
|
|
|
- ParameterRequestWrapper initWrapper = new ParameterRequestWrapper(request);
|
|
|
- // 不是登录操作
|
|
|
- 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);
|
|
|
- String tokenSign = request.getHeader("TokenSign");
|
|
|
- // 验证签名
|
|
|
- boolean verifySign = SM2CryptUtils.verifySign(SecretKeyConstants.CLIENT_PUBLIC_KEY,decryptTokenStr,tokenSign);
|
|
|
- if (!verifySign){
|
|
|
- // 验签失败
|
|
|
- ResponseInfo.doResponse(response,"token验签失败,不能访问系统!",401);
|
|
|
- return;
|
|
|
- }
|
|
|
- JwtTokenUtil jwtTokenUtil = new JwtTokenUtil();
|
|
|
- if (jwtTokenUtil.isTokenExpired(decryptTokenStr)){
|
|
|
- ResponseInfo.doResponse(response,"登录超时,请重新登录!",403);
|
|
|
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) {
|
|
|
+ try {
|
|
|
+ Map<String, Object> stringToMap = new HashMap(16);
|
|
|
+ ParameterRequestWrapper initWrapper = new ParameterRequestWrapper(request);
|
|
|
+ // 不是登录操作
|
|
|
+ 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);
|
|
|
+ String tokenSign = request.getHeader("TokenSign");
|
|
|
+ // 验证签名
|
|
|
+ boolean verifySign =
|
|
|
+ SM2CryptUtils.verifySign(SecretKeyConstants.CLIENT_PUBLIC_KEY, decryptTokenStr, tokenSign);
|
|
|
+ if (!verifySign) {
|
|
|
+ // 验签失败
|
|
|
+ ResponseInfo.doResponse(response, "token验签失败,不能访问系统!", 401);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ JwtTokenUtil jwtTokenUtil = new JwtTokenUtil();
|
|
|
+ if (jwtTokenUtil.isTokenExpired(decryptTokenStr)) {
|
|
|
+ ResponseInfo.doResponse(response, "登录超时,请重新登录!", 403);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ initWrapper.addHeader("Authorization", decryptTokenStr);
|
|
|
+ } else {
|
|
|
+ ResponseInfo.doResponse(response, "没有令牌权限,不能访问系统!", 401);
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
- initWrapper.addHeader("Authorization",decryptTokenStr);
|
|
|
- }
|
|
|
- else{
|
|
|
- ResponseInfo.doResponse(response,"没有令牌权限,不能访问系统!",401);
|
|
|
- return;
|
|
|
}
|
|
|
- }
|
|
|
- // 解密后的参数字符串
|
|
|
- String decryptStr = "";
|
|
|
-
|
|
|
- if ("POST".equalsIgnoreCase(request.getMethod())){
|
|
|
-
|
|
|
+ // 解密后的参数字符串
|
|
|
+ String decryptStr = "";
|
|
|
+ if ("POST".equalsIgnoreCase(request.getMethod())) {
|
|
|
byte[] bytes = null;
|
|
|
try {
|
|
|
bytes = initWrapper.getBodyContent(request).getBytes(StandardCharsets.UTF_8);
|
|
@@ -74,87 +74,82 @@ public class VerifySmFilter extends OncePerRequestFilter {
|
|
|
}
|
|
|
String json = new String(bytes);
|
|
|
JSONObject jsonObject = JSONUtil.parseObj(json);
|
|
|
- // 验证加密的参数文本
|
|
|
- String data_sm2 = jsonObject.getStr("secretData");
|
|
|
- if (StringUtils.isNotEmpty(data_sm2)){
|
|
|
- try {
|
|
|
- decryptStr = SM2CryptUtils.decrypt(data_sm2, SecretKeyConstants.SERVER_PRIVATE_KEY);
|
|
|
- }
|
|
|
- catch (Exception e){
|
|
|
- // 参数验签失败
|
|
|
- ResponseInfo.doResponse(response,"参数解密失败,不能访问系统!",401);
|
|
|
- return;
|
|
|
- }
|
|
|
- // 验签前端参数
|
|
|
- String paramSign = jsonObject.getStr("paramSign");
|
|
|
- try {
|
|
|
- // 验证签名
|
|
|
- boolean verifySign = SM2CryptUtils.verifySign(SecretKeyConstants.CLIENT_PUBLIC_KEY, decryptStr, paramSign);
|
|
|
- if (!verifySign){
|
|
|
+ // 验证加密的参数文本
|
|
|
+ String data_sm2 = jsonObject.getStr("secretData");
|
|
|
+ if (StringUtils.isNotEmpty(data_sm2)) {
|
|
|
+ try {
|
|
|
+ decryptStr = SM2CryptUtils.decrypt(data_sm2, SecretKeyConstants.SERVER_PRIVATE_KEY);
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 参数验签失败
|
|
|
+ ResponseInfo.doResponse(response, "参数解密失败,不能访问系统!", 401);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 验签前端参数
|
|
|
+ String paramSign = jsonObject.getStr("paramSign");
|
|
|
+ try {
|
|
|
+ // 验证签名
|
|
|
+ boolean verifySign =
|
|
|
+ SM2CryptUtils.verifySign(SecretKeyConstants.CLIENT_PUBLIC_KEY, decryptStr, paramSign);
|
|
|
+ if (!verifySign) {
|
|
|
+ // 验签失败
|
|
|
+ ResponseInfo.doResponse(response, "参数验签失败,不能访问系统!", 401);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
// 验签失败
|
|
|
- ResponseInfo.doResponse(response,"参数验签失败,不能访问系统!",401);
|
|
|
+ ResponseInfo.doResponse(response, "参数验签失败,不能访问系统!", 401);
|
|
|
return;
|
|
|
}
|
|
|
+ if (!"".equals(decryptStr)) {
|
|
|
+ stringToMap = JSONUtil.parseObj(decryptStr);
|
|
|
+ }
|
|
|
}
|
|
|
- catch (Exception e){
|
|
|
- // 验签失败
|
|
|
- ResponseInfo.doResponse(response,"参数验签失败,不能访问系统!",401);
|
|
|
- return;
|
|
|
- }
|
|
|
- if (!"".equals(decryptStr)){
|
|
|
- stringToMap = JSONUtil.parseObj(decryptStr);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else{
|
|
|
- // get请求无参数,取出是null
|
|
|
- String get_sm2Str = request.getParameter("0");
|
|
|
- if (StringUtils.isNotEmpty(get_sm2Str)){
|
|
|
- String[] tempStr = get_sm2Str.split("&");
|
|
|
- Map<String,String> tempMap = new HashMap(16);
|
|
|
- for (int i=0;i<tempStr.length;i++){
|
|
|
- String[] fieldStr = tempStr[i].split("=");
|
|
|
- tempMap.put(fieldStr[0],fieldStr[1]);
|
|
|
- }
|
|
|
- // 对加密串解密验签
|
|
|
- try {
|
|
|
- decryptStr = SM2CryptUtils.decrypt(tempMap.get("secretData"), SecretKeyConstants.SERVER_PRIVATE_KEY);
|
|
|
- }
|
|
|
- catch (Exception e){
|
|
|
- // 参数验签失败
|
|
|
- ResponseInfo.doResponse(response,"参数解密失败,不能访问系统!",401);
|
|
|
- return;
|
|
|
- }
|
|
|
- // 验签前端参数
|
|
|
- String paramSign = tempMap.get("paramSign");
|
|
|
- // 验证签名
|
|
|
- try {
|
|
|
- boolean verifySign = SM2CryptUtils.verifySign(SecretKeyConstants.CLIENT_PUBLIC_KEY, decryptStr, paramSign);
|
|
|
- if (!verifySign){
|
|
|
+ } else {
|
|
|
+ // get请求无参数,取出是null
|
|
|
+ String get_sm2Str = request.getParameter("0");
|
|
|
+ if (StringUtils.isNotEmpty(get_sm2Str)) {
|
|
|
+ String[] tempStr = get_sm2Str.split("&");
|
|
|
+ Map<String, String> tempMap = new HashMap(16);
|
|
|
+ for (int i = 0; i < tempStr.length; i++) {
|
|
|
+ String[] fieldStr = tempStr[i].split("=");
|
|
|
+ tempMap.put(fieldStr[0], fieldStr[1]);
|
|
|
+ }
|
|
|
+ // 对加密串解密验签
|
|
|
+ try {
|
|
|
+ decryptStr =
|
|
|
+ SM2CryptUtils.decrypt(tempMap.get("secretData"), SecretKeyConstants.SERVER_PRIVATE_KEY);
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 参数验签失败
|
|
|
+ ResponseInfo.doResponse(response, "参数解密失败,不能访问系统!", 401);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 验签前端参数
|
|
|
+ String paramSign = tempMap.get("paramSign");
|
|
|
+ // 验证签名
|
|
|
+ try {
|
|
|
+ boolean verifySign =
|
|
|
+ SM2CryptUtils.verifySign(SecretKeyConstants.CLIENT_PUBLIC_KEY, decryptStr, paramSign);
|
|
|
+ if (!verifySign) {
|
|
|
+ // 验签失败
|
|
|
+ ResponseInfo.doResponse(response, "参数验签失败,不能访问系统!", 401);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
// 验签失败
|
|
|
- ResponseInfo.doResponse(response,"参数验签失败,不能访问系统!",401);
|
|
|
+ ResponseInfo.doResponse(response, "参数验签失败,不能访问系统!", 401);
|
|
|
return;
|
|
|
}
|
|
|
- }
|
|
|
- catch (Exception e){
|
|
|
- // 验签失败
|
|
|
- ResponseInfo.doResponse(response,"参数验签失败,不能访问系统!",401);
|
|
|
- return;
|
|
|
- }
|
|
|
- if (!"".equals(decryptStr)){
|
|
|
- stringToMap = JSONUtil.parseObj(decryptStr).getRaw();
|
|
|
+ if (!"".equals(decryptStr)) {
|
|
|
+ stringToMap = JSONUtil.parseObj(decryptStr).getRaw();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- ParameterRequestWrapper pr = null;
|
|
|
- try {
|
|
|
- pr = new ParameterRequestWrapper(initWrapper, stringToMap,decryptStr);
|
|
|
+ ParameterRequestWrapper pr = new ParameterRequestWrapper(initWrapper, stringToMap, decryptStr);
|
|
|
+ filterChain.doFilter(pr, response);
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
- ResponseInfo.doResponse(response,"访问失败,联系管理员!",401);
|
|
|
+ ResponseInfo.doResponse(response, "访问失败,联系管理员!", 401);
|
|
|
return;
|
|
|
}
|
|
|
- filterChain.doFilter(pr, response);
|
|
|
}
|
|
|
}
|