Commit 3d9b0293ddf752218e2a12eccd928d9c68fbe323

Authored by puff
2 parents 21e6da1a 0c615299

Merge branch 'desensitization' into develop

huaheng-wms-core/src/main/java/org/jeecg/modules/desensitization/plugin/DesensitizationInterceptor.java renamed to huaheng-wms-core/src/main/java/org/jeecg/modules/desensitization/plugin/DesensitizationResultSetInterceptor.java
1 package org.jeecg.modules.desensitization.plugin; 1 package org.jeecg.modules.desensitization.plugin;
2 2
3 -  
4 -import cn.hutool.core.util.ObjectUtil;  
5 import org.apache.ibatis.executor.resultset.ResultSetHandler; 3 import org.apache.ibatis.executor.resultset.ResultSetHandler;
6 import org.apache.ibatis.plugin.*; 4 import org.apache.ibatis.plugin.*;
7 import org.apache.shiro.SecurityUtils; 5 import org.apache.shiro.SecurityUtils;
8 -import org.jeecg.common.exception.JeecgBootException;  
9 import org.jeecg.modules.desensitization.annotation.SensitiveField; 6 import org.jeecg.modules.desensitization.annotation.SensitiveField;
10 import org.jeecg.modules.desensitization.enums.SensitiveTypeEnums; 7 import org.jeecg.modules.desensitization.enums.SensitiveTypeEnums;
11 import org.jeecg.modules.desensitization.strategy.SensitiveContext; 8 import org.jeecg.modules.desensitization.strategy.SensitiveContext;
12 import org.jeecg.modules.desensitization.strategy.SensitiveStrategy; 9 import org.jeecg.modules.desensitization.strategy.SensitiveStrategy;
13 -import org.jeecg.modules.system.entity.SysUserRole;  
14 -import org.jeecg.modules.system.service.ISysRoleService;  
15 -import org.jeecg.utils.HuahengJwtUtil;  
16 import org.reflections.ReflectionUtils; 10 import org.reflections.ReflectionUtils;
17 import org.slf4j.Logger; 11 import org.slf4j.Logger;
18 import org.slf4j.LoggerFactory; 12 import org.slf4j.LoggerFactory;
19 -import org.springframework.core.annotation.Order;  
20 -import org.springframework.stereotype.Service;  
21 -import org.springframework.util.CollectionUtils;  
22 13
23 -import javax.annotation.Resource;  
24 -import javax.servlet.http.HttpServletRequest; 14 +import java.sql.Statement;
25 import java.lang.reflect.Field; 15 import java.lang.reflect.Field;
26 import java.util.*; 16 import java.util.*;
27 import java.util.concurrent.ConcurrentHashMap; 17 import java.util.concurrent.ConcurrentHashMap;
28 18
29 -import static org.jeecg.utils.HuahengJwtUtil.getRolesByToken;  
30 -  
31 -  
32 -/**  
33 - * 基于拦截器对数据脱敏  
34 - *  
35 - * @author xub  
36 - * @date 2022/6/2 下午2:23  
37 - */  
38 @Intercepts({ 19 @Intercepts({
39 - @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {java.sql.Statement.class}) 20 + @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})
40 }) 21 })
41 -@Service  
42 -@Order(-1)  
43 -public class DesensitizationInterceptor implements Interceptor {  
44 - 22 +public class DesensitizationResultSetInterceptor implements Interceptor {
45 23
46 - private static final Logger log = LoggerFactory.getLogger(DesensitizationInterceptor.class); 24 + private static final Logger log = LoggerFactory.getLogger(DesensitizationResultSetInterceptor.class);
47 25
48 - /**  
49 - * key值为class对象 value可以理解成是该类带有SensitiveField注解的属性,只不过对属性封装了一层。  
50 - * 它是非常能够提高性能的处理器 它的作用就是不用每一次一个对象经来都要看下它的哪些属性带有SensitiveField注解  
51 - * 毕竟类的反射在性能上并不友好。只要key包含该对象那就不需要检查它哪些属性带SensitiveField注解。  
52 - */  
53 - private Map<Class, List<Handler>> handlerMap = new ConcurrentHashMap<>(); 26 + private final Map<Class<?>, List<Handler>> handlerMap = new ConcurrentHashMap<>();
54 27
55 @Override 28 @Override
56 public Object intercept(Invocation invocation) throws Throwable { 29 public Object intercept(Invocation invocation) throws Throwable {
57 - // 获取结果  
58 - List<Object> results = (List<Object>) invocation.proceed();  
59 - if (CollectionUtils.isEmpty(results)) {  
60 - return results;  
61 - }  
62 - // 批量设置加密  
63 - for (Object object : results) {  
64 - process(object); 30 + Object result = invocation.proceed();
  31 +
  32 + // 仅对查询结果集进行脱敏处理
  33 + if (result instanceof List) {
  34 + List<?> results = (List<?>) result;
  35 + for (Object object : results) {
  36 + process(object);
  37 + }
65 } 38 }
66 - return results; 39 + return result;
67 } 40 }
68 41
69 -  
70 private void process(Object object) throws Throwable { 42 private void process(Object object) throws Throwable {
71 - if(ObjectUtil.isNotEmpty(object)){  
72 - Class handlerKey = object.getClass(); 43 + if (object != null) {
  44 + Class<?> handlerKey = object.getClass();
73 List<Handler> handlerList = handlerMap.get(handlerKey); 45 List<Handler> handlerList = handlerMap.get(handlerKey);
74 - //性能优化点,如果有两个都是user对象同时,那么只需有个进行反射处理属性就好了,另一个只需执行下面的for循环  
75 - SYNC:  
76 if (handlerList == null) { 46 if (handlerList == null) {
77 synchronized (this) { 47 synchronized (this) {
78 handlerList = handlerMap.get(handlerKey); 48 handlerList = handlerMap.get(handlerKey);
79 - //如果到这里map集合已经存在,则跳出到指定SYNC标签  
80 - if (handlerList != null) {  
81 - break SYNC;  
82 - }  
83 - handlerMap.put(handlerKey, handlerList = new ArrayList<>());  
84 - // 反射工具类 获取带有SensitiveField注解的所有属性字段  
85 - Set<Field> allFields = ReflectionUtils.getAllFields(  
86 - object.getClass(),  
87 - input -> input != null && input.getAnnotation(SensitiveField.class) != null  
88 - );  
89 -  
90 - for (Field field : allFields) {  
91 - handlerList.add(new Handler(field)); 49 + if (handlerList == null) {
  50 + handlerList = new ArrayList<>();
  51 + Set<Field> allFields = ReflectionUtils.getAllFields(
  52 + object.getClass(),
  53 + input -> input != null && input.getAnnotation(SensitiveField.class) != null
  54 + );
  55 + for (Field field : allFields) {
  56 + handlerList.add(new Handler(field));
  57 + }
  58 + handlerMap.put(handlerKey, handlerList);
92 } 59 }
93 } 60 }
94 } 61 }
@@ -96,10 +63,8 @@ public class DesensitizationInterceptor implements Interceptor { @@ -96,10 +63,8 @@ public class DesensitizationInterceptor implements Interceptor {
96 handler.accept(object); 63 handler.accept(object);
97 } 64 }
98 } 65 }
99 -  
100 } 66 }
101 67
102 -  
103 @Override 68 @Override
104 public Object plugin(Object target) { 69 public Object plugin(Object target) {
105 return Plugin.wrap(target, this); 70 return Plugin.wrap(target, this);
@@ -109,35 +74,35 @@ public class DesensitizationInterceptor implements Interceptor { @@ -109,35 +74,35 @@ public class DesensitizationInterceptor implements Interceptor {
109 public void setProperties(Properties properties) { 74 public void setProperties(Properties properties) {
110 } 75 }
111 76
112 -  
113 private static class Handler { 77 private static class Handler {
114 - Field field; 78 + private final Field field;
  79 + private final SensitiveTypeEnums typeEnums;
  80 + private final String fillValue;
  81 + private final SensitiveStrategy sensitiveStrategy;
115 82
116 Handler(Field field) { 83 Handler(Field field) {
117 this.field = field; 84 this.field = field;
  85 + SensitiveField annotation = field.getAnnotation(SensitiveField.class);
  86 + this.typeEnums = annotation.value();
  87 + this.fillValue = annotation.fillValue();
  88 + this.sensitiveStrategy = SensitiveContext.get(typeEnums);
118 } 89 }
119 90
120 - private boolean checkField(Object object, Field field) throws IllegalAccessException { 91 + private boolean checkField(Object object) throws IllegalAccessException {
121 if (!field.isAccessible()) { 92 if (!field.isAccessible()) {
122 field.setAccessible(true); 93 field.setAccessible(true);
123 } 94 }
124 - //如果为空 那么就不用进行脱敏操作了  
125 return field.get(object) != null; 95 return field.get(object) != null;
126 } 96 }
127 97
128 public void accept(Object o) throws Throwable { 98 public void accept(Object o) throws Throwable {
129 - if (checkField(o, field)) {  
130 - SensitiveField annotation = field.getAnnotation(SensitiveField.class);  
131 - SensitiveTypeEnums typeEnums = annotation.value();  
132 - String fillValue = annotation.fillValue();  
133 - Object o1 = field.get(o);  
134 - if(!SecurityUtils.getSubject().hasRole("desensitization")){  
135 - SensitiveStrategy sensitiveStrategy = SensitiveContext.get(typeEnums);  
136 - String s = sensitiveStrategy.handle(o1, fillValue);  
137 - field.set(o, s); 99 + if (checkField(o)) {
  100 + if (!SecurityUtils.getSubject().hasRole("desensitization")) {
  101 + Object fieldValue = field.get(o);
  102 + String maskedValue = sensitiveStrategy.handle(fieldValue, fillValue);
  103 + field.set(o, maskedValue);
138 } 104 }
139 } 105 }
140 } 106 }
141 } 107 }
142 -  
143 } 108 }
huaheng-wms-core/src/main/java/org/jeecg/modules/desensitization/plugin/MyBatisUpdateInterceptor.java 0 → 100644
  1 +package org.jeecg.modules.desensitization.plugin;
  2 +
  3 +import org.apache.ibatis.executor.Executor;
  4 +import org.apache.ibatis.mapping.MappedStatement;
  5 +import org.apache.ibatis.plugin.*;
  6 +import org.slf4j.Logger;
  7 +import org.slf4j.LoggerFactory;
  8 +import org.springframework.core.annotation.Order;
  9 +import org.springframework.stereotype.Service;
  10 +
  11 +import java.util.Properties;
  12 +
  13 +@Intercepts({
  14 + @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
  15 +})
  16 +@Service
  17 +@Order(-1)
  18 +public class MyBatisUpdateInterceptor implements Interceptor {
  19 +
  20 +
  21 + private static final Logger log = LoggerFactory.getLogger(MyBatisUpdateInterceptor.class);
  22 +
  23 + @Override
  24 + public Object intercept(Invocation invocation) throws Throwable {
  25 + // 在这里处理插入/更新/删除前后的操作
  26 + return invocation.proceed();
  27 + }
  28 +
  29 + @Override
  30 + public Object plugin(Object target) {
  31 + return Plugin.wrap(target, this);
  32 + }
  33 +
  34 + @Override
  35 + public void setProperties(Properties properties) {
  36 + }
  37 +}
huaheng-wms-core/src/main/java/org/jeecg/modules/system/entity/SysUser.java
@@ -47,7 +47,7 @@ public class SysUser implements Serializable { @@ -47,7 +47,7 @@ public class SysUser implements Serializable {
47 * 登录账号 47 * 登录账号
48 */ 48 */
49 @Excel(name = "登录账号", width = 15) 49 @Excel(name = "登录账号", width = 15)
50 -// @SensitiveField(SensitiveTypeEnums.CHINESE_NAME) 50 + @SensitiveField(SensitiveTypeEnums.CHINESE_NAME)
51 private String username; 51 private String username;
52 52
53 /** 53 /**
huaheng-wms-core/src/main/resources/mybatis-config.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8" ?>
  2 +<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  3 + "http://mybatis.org/dtd/mybatis-3-config.dtd">
  4 +<configuration>
  5 +
  6 + <!-- 其他 MyBatis 配置 -->
  7 +
  8 + <plugins>
  9 + <!-- 配置查询操作的脱敏拦截器 -->
  10 + <plugin interceptor="org.jeecg.modules.desensitization.plugin.DesensitizationResultSetInterceptor"/>
  11 + <!-- 配置插入、更新、删除操作的拦截器 -->
  12 + <plugin interceptor="org.jeecg.modules.desensitization.plugin.MyBatisUpdateInterceptor"/>
  13 + </plugins>
  14 +
  15 + <!-- 其他 MyBatis 配置 -->
  16 +
  17 +</configuration>