woody 3 ヶ月 前
コミット
0425bdc4d4
20 ファイル変更271 行追加210 行削除
  1. 0 21
      framework-common/src/main/java/com/chelvc/framework/common/util/AESUtils.java
  2. 27 33
      framework-database/src/main/java/com/chelvc/framework/database/config/DatabaseConfigurer.java
  3. 6 6
      framework-database/src/main/java/com/chelvc/framework/database/config/TypeHandlerConfigurer.java
  4. 10 15
      framework-database/src/main/java/com/chelvc/framework/database/context/TableContext.java
  5. 4 3
      framework-database/src/main/java/com/chelvc/framework/database/context/TableFieldContext.java
  6. 8 112
      framework-database/src/main/java/com/chelvc/framework/database/handler/JsonTypeHandler.java
  7. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/SensitiveArrayTypeHandler.java
  8. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/SensitiveListTypeHandler.java
  9. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/SensitiveSetTypeHandler.java
  10. 23 0
      framework-database/src/main/java/com/chelvc/framework/database/jackson/SensitiveArrayDeserializer.java
  11. 24 0
      framework-database/src/main/java/com/chelvc/framework/database/jackson/SensitiveArraySerializer.java
  12. 22 0
      framework-database/src/main/java/com/chelvc/framework/database/jackson/SensitiveDeserializer.java
  13. 24 0
      framework-database/src/main/java/com/chelvc/framework/database/jackson/SensitiveListDeserializer.java
  14. 25 0
      framework-database/src/main/java/com/chelvc/framework/database/jackson/SensitiveListSerializer.java
  15. 24 0
      framework-database/src/main/java/com/chelvc/framework/database/jackson/SensitiveSerializer.java
  16. 24 0
      framework-database/src/main/java/com/chelvc/framework/database/jackson/SensitiveSetDeserializer.java
  17. 25 0
      framework-database/src/main/java/com/chelvc/framework/database/jackson/SensitiveSetSerializer.java
  18. 0 5
      framework-elasticsearch/src/main/java/com/chelvc/framework/elasticsearch/DefaultElasticsearchHandler.java
  19. 0 11
      framework-elasticsearch/src/main/java/com/chelvc/framework/elasticsearch/ElasticsearchHandler.java
  20. 22 1
      framework-security/src/main/java/com/chelvc/framework/security/crypto/DefaultSecurityCipherHandler.java

+ 0 - 21
framework-common/src/main/java/com/chelvc/framework/common/util/AESUtils.java

@@ -78,27 +78,6 @@ public final class AESUtils {
         return offset == 8 ? key : StringUtils.rjust(key, key.length() + offset, '0');
     }
 
-    /**
-     * 根据字符串获取向量
-     *
-     * @param str 字符串
-     * @return 向量
-     */
-    public static String str2iv(String str) {
-        if (StringUtils.isEmpty(str)) {
-            return str;
-        }
-        int size = Math.min(str.length(), 16);
-        if (size == 1) {
-            return str;
-        }
-        StringBuilder iv = new StringBuilder(size);
-        for (int i = str.length() - 1, max = 0; i >= 0 && max < size; i--, max++) {
-            iv.append(str.charAt(i));
-        }
-        return iv.toString();
-    }
-
     /**
      * 获取密码处理器
      *

+ 27 - 33
framework-database/src/main/java/com/chelvc/framework/database/config/DatabaseConfigurer.java

@@ -31,10 +31,8 @@ import com.chelvc.framework.database.interceptor.DeletedIsolateInterceptor;
 import com.chelvc.framework.database.interceptor.EnvIsolateInterceptor;
 import com.chelvc.framework.database.support.EnhanceSqlInjector;
 import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
 import org.apache.ibatis.type.JdbcType;
 import org.apache.ibatis.type.TypeHandlerRegistry;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Bean;
@@ -48,11 +46,7 @@ import org.springframework.transaction.annotation.Transactional;
  * @date 2024/1/30
  */
 @Configuration
-@RequiredArgsConstructor(onConstructor = @__(@Autowired))
 public class DatabaseConfigurer {
-    private final DatabaseProperties properties;
-    private final ApplicationContext applicationContext;
-
     @Bean
     @ConditionalOnMissingBean(Transactor.class)
     public Transactor transactor() {
@@ -88,33 +82,6 @@ public class DatabaseConfigurer {
         return new EnhanceSqlInjector();
     }
 
-    @Bean
-    public MybatisPlusInterceptor mybatisPlusInterceptor() {
-        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
-
-        // 设置自定义租户隔离拦截器
-        ApplicationContextHolder.getOrderBeans(this.applicationContext, InnerInterceptor.class)
-                .forEach(interceptor::addInnerInterceptor);
-
-        // 设置数据环境隔离过滤拦截器
-        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor() {
-            {
-                this.setTenantLineHandler(new EnvIsolateInterceptor());
-            }
-        });
-
-        // 设置数据逻辑删除过滤拦截器
-        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor() {
-            {
-                this.setTenantLineHandler(new DeletedIsolateInterceptor());
-            }
-        });
-
-        // 设置分页拦截器,数据过滤条件与拦截器设置顺序有关,分页拦截器最后设置才能在分页时同时使用数据隔离过滤条件
-        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
-        return interceptor;
-    }
-
     @Bean
     public ConfigurationCustomizer configurationCustomizer() {
         return configuration -> {
@@ -142,4 +109,31 @@ public class DatabaseConfigurer {
         }
         return handler;
     }
+
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor(ApplicationContext applicationContext) {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+
+        // 设置自定义租户隔离拦截器
+        ApplicationContextHolder.getOrderBeans(applicationContext, InnerInterceptor.class)
+                .forEach(interceptor::addInnerInterceptor);
+
+        // 设置数据环境隔离过滤拦截器
+        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor() {
+            {
+                this.setTenantLineHandler(new EnvIsolateInterceptor());
+            }
+        });
+
+        // 设置数据逻辑删除过滤拦截器
+        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor() {
+            {
+                this.setTenantLineHandler(new DeletedIsolateInterceptor());
+            }
+        });
+
+        // 设置分页拦截器,数据过滤条件与拦截器设置顺序有关,分页拦截器最后设置才能在分页时同时使用数据隔离过滤条件
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
+        return interceptor;
+    }
 }

+ 6 - 6
framework-database/src/main/java/com/chelvc/framework/database/config/TypeHandlerConfigurer.java

@@ -66,9 +66,9 @@ import com.chelvc.framework.database.handler.RangesTypeHandler;
 import com.chelvc.framework.database.handler.RegionArrayTypeHandler;
 import com.chelvc.framework.database.handler.RegionSetTypeHandler;
 import com.chelvc.framework.database.handler.RegionsTypeHandler;
-import com.chelvc.framework.database.handler.SensitiveStringArrayTypeHandler;
-import com.chelvc.framework.database.handler.SensitiveStringSetTypeHandler;
-import com.chelvc.framework.database.handler.SensitiveStringsTypeHandler;
+import com.chelvc.framework.database.handler.SensitiveArrayTypeHandler;
+import com.chelvc.framework.database.handler.SensitiveSetTypeHandler;
+import com.chelvc.framework.database.handler.SensitiveListTypeHandler;
 import com.chelvc.framework.database.handler.SensitiveTypeHandler;
 import com.chelvc.framework.database.handler.SetTypeHandler;
 import com.chelvc.framework.database.handler.SetsTypeHandler;
@@ -353,11 +353,11 @@ public class TypeHandlerConfigurer extends MybatisConfigurer {
         // 如果是敏感字段,则初始化敏感字段类型处理器
         if (field.isAnnotationPresent(Sensitive.class)) {
             if (handler == StringsTypeHandler.class) {
-                return SensitiveStringsTypeHandler.class;
+                return SensitiveListTypeHandler.class;
             } else if (handler == StringSetTypeHandler.class) {
-                return SensitiveStringSetTypeHandler.class;
+                return SensitiveSetTypeHandler.class;
             } else if (handler == StringArrayTypeHandler.class) {
-                return SensitiveStringArrayTypeHandler.class;
+                return SensitiveArrayTypeHandler.class;
             } else if (model == String.class
                     && (handler == null || !SensitiveTypeHandler.class.isAssignableFrom(handler))) {
                 return this.initializeSensitiveHandlerClass(model, handler);

+ 10 - 15
framework-database/src/main/java/com/chelvc/framework/database/context/TableContext.java

@@ -7,7 +7,6 @@ import java.util.stream.Collectors;
 
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import com.chelvc.framework.common.util.ObjectUtils;
-import com.chelvc.framework.database.annotation.Sensitive;
 import lombok.Getter;
 import lombok.NonNull;
 
@@ -19,20 +18,16 @@ import lombok.NonNull;
  */
 @Getter
 public class TableContext implements Serializable {
-    private final TableInfo info;
-    private final Map<String, TableFieldContext> fieldContexts;
+    private final TableInfo table;
+    private final Map<String, TableFieldContext> fields;
 
-    public TableContext(@NonNull TableInfo info) {
-        this.info = info;
-        if (ObjectUtils.isEmpty(info.getFieldList())) {
-            this.fieldContexts = Collections.emptyMap();
+    public TableContext(@NonNull TableInfo table) {
+        this.table = table;
+        if (ObjectUtils.isEmpty(table.getFieldList())) {
+            this.fields = Collections.emptyMap();
         } else {
-            this.fieldContexts = Collections.unmodifiableMap(info.getFieldList().stream().collect(Collectors.toMap(
-                    field -> DatabaseContextHolder.unquote(field.getColumn()),
-                    field -> {
-                        boolean sensitive = field.getField().isAnnotationPresent(Sensitive.class);
-                        return new TableFieldContext(field, sensitive);
-                    }
+            this.fields = Collections.unmodifiableMap(table.getFieldList().stream().collect(Collectors.toMap(
+                    field -> DatabaseContextHolder.unquote(field.getColumn()), TableFieldContext::new
             )));
         }
     }
@@ -43,7 +38,7 @@ public class TableContext implements Serializable {
      * @return 模型对象
      */
     public Class<?> getModel() {
-        return this.info.getEntityType();
+        return this.table.getEntityType();
     }
 
     /**
@@ -53,6 +48,6 @@ public class TableContext implements Serializable {
      * @return 表字段上下文
      */
     public TableFieldContext getFieldContext(@NonNull String field) {
-        return this.fieldContexts.get(DatabaseContextHolder.unquote(field));
+        return this.fields.get(DatabaseContextHolder.unquote(field));
     }
 }

+ 4 - 3
framework-database/src/main/java/com/chelvc/framework/database/context/TableFieldContext.java

@@ -7,6 +7,7 @@ import java.sql.SQLException;
 
 import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
 import com.chelvc.framework.common.util.ObjectUtils;
+import com.chelvc.framework.database.annotation.Sensitive;
 import com.chelvc.framework.database.handler.SensitiveTypeHandler;
 import com.chelvc.framework.database.sql.WriteStringAcceptor;
 import lombok.Getter;
@@ -23,12 +24,12 @@ import org.apache.ibatis.type.UnknownTypeHandler;
  */
 @Getter
 public class TableFieldContext implements Serializable {
-    private final TableFieldInfo info;
     private final boolean sensitive;
+    private final TableFieldInfo info;
 
-    public TableFieldContext(@NonNull TableFieldInfo info, boolean sensitive) {
+    public TableFieldContext(@NonNull TableFieldInfo info) {
         this.info = info;
-        this.sensitive = sensitive;
+        this.sensitive = info.getField().isAnnotationPresent(Sensitive.class);
     }
 
     /**

+ 8 - 112
framework-database/src/main/java/com/chelvc/framework/database/handler/JsonTypeHandler.java

@@ -1,6 +1,5 @@
 package com.chelvc.framework.database.handler;
 
-import java.io.IOException;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Array;
 import java.lang.reflect.Method;
@@ -20,17 +19,17 @@ import java.util.Set;
 import com.chelvc.framework.common.util.JacksonUtils;
 import com.chelvc.framework.common.util.ObjectUtils;
 import com.chelvc.framework.database.annotation.Sensitive;
-import com.chelvc.framework.database.context.DatabaseContextHolder;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.JsonProcessingException;
+import com.chelvc.framework.database.jackson.SensitiveArrayDeserializer;
+import com.chelvc.framework.database.jackson.SensitiveArraySerializer;
+import com.chelvc.framework.database.jackson.SensitiveDeserializer;
+import com.chelvc.framework.database.jackson.SensitiveListDeserializer;
+import com.chelvc.framework.database.jackson.SensitiveListSerializer;
+import com.chelvc.framework.database.jackson.SensitiveSerializer;
+import com.chelvc.framework.database.jackson.SensitiveSetDeserializer;
+import com.chelvc.framework.database.jackson.SensitiveSetSerializer;
 import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.DeserializationContext;
 import com.fasterxml.jackson.databind.JavaType;
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.fasterxml.jackson.databind.JsonSerializer;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.introspect.Annotated;
 import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
 import com.fasterxml.jackson.databind.type.CollectionType;
@@ -49,109 +48,6 @@ import org.apache.ibatis.type.TypeHandler;
  * @date 2024/4/3
  */
 public interface JsonTypeHandler<T> extends TypeHandler<T> {
-    /**
-     * 敏感字符串序列化处理器
-     */
-    class SensitiveSerializer extends JsonSerializer<String> {
-        @Override
-        public void serialize(String value, JsonGenerator generator, SerializerProvider provider) throws IOException {
-            if (DatabaseContextHolder.getDatabaseCipherHandler().isWritable()) {
-                value = DatabaseContextHolder.getDatabaseCipherHandler().encrypt(value, true);
-            }
-            generator.writeString(value);
-        }
-    }
-
-    /**
-     * 敏感字符串数组序列化处理器
-     */
-    class SensitiveArraySerializer extends JsonSerializer<String[]> {
-        @Override
-        public void serialize(String[] value, JsonGenerator generator, SerializerProvider provider)
-                throws IOException {
-            if (DatabaseContextHolder.getDatabaseCipherHandler().isWritable()) {
-                value = DatabaseContextHolder.getDatabaseCipherHandler().encrypt(value, true);
-            }
-            generator.writeObject(value);
-        }
-    }
-
-    /**
-     * 敏感字符串集合序列化处理器
-     */
-    class SensitiveSetSerializer extends JsonSerializer<Set<String>> {
-        @Override
-        public void serialize(Set<String> value, JsonGenerator generator, SerializerProvider provider)
-                throws IOException {
-            if (DatabaseContextHolder.getDatabaseCipherHandler().isWritable()) {
-                value = DatabaseContextHolder.getDatabaseCipherHandler().encrypt(value, true);
-            }
-            generator.writeObject(value);
-        }
-    }
-
-    /**
-     * 敏感字符串列表序列化处理器
-     */
-    class SensitiveListSerializer extends JsonSerializer<List<String>> {
-        @Override
-        public void serialize(List<String> value, JsonGenerator generator, SerializerProvider provider)
-                throws IOException {
-            if (DatabaseContextHolder.getDatabaseCipherHandler().isWritable()) {
-                value = DatabaseContextHolder.getDatabaseCipherHandler().encrypt(value, true);
-            }
-            generator.writeObject(value);
-        }
-    }
-
-    /**
-     * 敏感字符串反序列化处理器
-     */
-    class SensitiveDeserializer extends JsonDeserializer<String> {
-        @Override
-        public String deserialize(JsonParser parser, DeserializationContext context)
-                throws IOException, JsonProcessingException {
-            String value = parser.getValueAsString();
-            return DatabaseContextHolder.getDatabaseCipherHandler().decrypt(value, true);
-        }
-    }
-
-    /**
-     * 敏感字符串数组反序列化处理器
-     */
-    class SensitiveArrayDeserializer extends JsonDeserializer<String[]> {
-        @Override
-        public String[] deserialize(JsonParser parser, DeserializationContext context)
-                throws IOException, JsonProcessingException {
-            String[] values = parser.readValueAs(JacksonUtils.STRING_ARRAY_TYPE);
-            return DatabaseContextHolder.getDatabaseCipherHandler().decrypt(values, true);
-        }
-    }
-
-    /**
-     * 敏感字符串集合反序列化处理器
-     */
-    class SensitiveSetDeserializer extends JsonDeserializer<Set<String>> {
-        @Override
-        public Set<String> deserialize(JsonParser parser, DeserializationContext context)
-                throws IOException, JsonProcessingException {
-            Set<String> values = parser.readValueAs(JacksonUtils.STRING_SET_TYPE);
-            return DatabaseContextHolder.getDatabaseCipherHandler().decrypt(values, true);
-        }
-    }
-
-    /**
-     * 敏感字符串列表反序列化处理器
-     */
-    class SensitiveListDeserializer extends JsonDeserializer<List<String>> {
-        @Override
-        public List<String> deserialize(JsonParser parser, DeserializationContext context)
-                throws IOException, JsonProcessingException {
-            List<String> values = parser.readValueAs(JacksonUtils.STRING_LIST_TYPE);
-            return DatabaseContextHolder.getDatabaseCipherHandler().decrypt(values, true);
-        }
-    }
-
     /**
      * 对象JSON序列化/反序列化处理器实例
      */

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/SensitiveStringArrayTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/SensitiveArrayTypeHandler.java

@@ -14,7 +14,7 @@ import org.apache.ibatis.type.JdbcType;
  * @author Woody
  * @date 2024/6/18
  */
-public class SensitiveStringArrayTypeHandler extends StringArrayTypeHandler {
+public class SensitiveArrayTypeHandler extends JsonTypeHandler.Default<String[]> {
     @Override
     public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType)
             throws SQLException {

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/SensitiveStringsTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/SensitiveListTypeHandler.java

@@ -15,7 +15,7 @@ import org.apache.ibatis.type.JdbcType;
  * @author Woody
  * @date 2024/6/17
  */
-public class SensitiveStringsTypeHandler extends StringsTypeHandler {
+public class SensitiveListTypeHandler extends JsonTypeHandler.Default<List<String>> {
     @Override
     public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType)
             throws SQLException {

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/SensitiveStringSetTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/SensitiveSetTypeHandler.java

@@ -15,7 +15,7 @@ import org.apache.ibatis.type.JdbcType;
  * @author Woody
  * @date 2024/6/18
  */
-public class SensitiveStringSetTypeHandler extends StringSetTypeHandler {
+public class SensitiveSetTypeHandler extends JsonTypeHandler.Default<Set<String>> {
     @Override
     public void setNonNullParameter(PreparedStatement ps, int i, Set<String> parameter, JdbcType jdbcType)
             throws SQLException {

+ 23 - 0
framework-database/src/main/java/com/chelvc/framework/database/jackson/SensitiveArrayDeserializer.java

@@ -0,0 +1,23 @@
+package com.chelvc.framework.database.jackson;
+
+import java.io.IOException;
+
+import com.chelvc.framework.common.util.JacksonUtils;
+import com.chelvc.framework.database.context.DatabaseContextHolder;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+
+/**
+ * 敏感字符串数组JSON反序列化处理器
+ *
+ * @author Woody
+ * @date 2025/1/7
+ */
+public class SensitiveArrayDeserializer extends JsonDeserializer<String[]> {
+    @Override
+    public String[] deserialize(JsonParser parser, DeserializationContext context) throws IOException {
+        String[] values = parser.readValueAs(JacksonUtils.STRING_ARRAY_TYPE);
+        return DatabaseContextHolder.getDatabaseCipherHandler().decrypt(values, true);
+    }
+}

+ 24 - 0
framework-database/src/main/java/com/chelvc/framework/database/jackson/SensitiveArraySerializer.java

@@ -0,0 +1,24 @@
+package com.chelvc.framework.database.jackson;
+
+import java.io.IOException;
+
+import com.chelvc.framework.database.context.DatabaseContextHolder;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+/**
+ * 敏感字符串数组JSON序列化处理器
+ *
+ * @author Woody
+ * @date 2025/1/7
+ */
+public class SensitiveArraySerializer extends JsonSerializer<String[]> {
+    @Override
+    public void serialize(String[] value, JsonGenerator generator, SerializerProvider provider) throws IOException {
+        if (DatabaseContextHolder.getDatabaseCipherHandler().isWritable()) {
+            value = DatabaseContextHolder.getDatabaseCipherHandler().encrypt(value, true);
+        }
+        generator.writeObject(value);
+    }
+}

+ 22 - 0
framework-database/src/main/java/com/chelvc/framework/database/jackson/SensitiveDeserializer.java

@@ -0,0 +1,22 @@
+package com.chelvc.framework.database.jackson;
+
+import java.io.IOException;
+
+import com.chelvc.framework.database.context.DatabaseContextHolder;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+
+/**
+ * 敏感字符串JSON反序列化处理器
+ *
+ * @author Woody
+ * @date 2025/1/7
+ */
+public class SensitiveDeserializer extends JsonDeserializer<String> {
+    @Override
+    public String deserialize(JsonParser parser, DeserializationContext context) throws IOException {
+        String value = parser.getValueAsString();
+        return DatabaseContextHolder.getDatabaseCipherHandler().decrypt(value, true);
+    }
+}

+ 24 - 0
framework-database/src/main/java/com/chelvc/framework/database/jackson/SensitiveListDeserializer.java

@@ -0,0 +1,24 @@
+package com.chelvc.framework.database.jackson;
+
+import java.io.IOException;
+import java.util.List;
+
+import com.chelvc.framework.common.util.JacksonUtils;
+import com.chelvc.framework.database.context.DatabaseContextHolder;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+
+/**
+ * 敏感字符串列表JSON反序列化处理器
+ *
+ * @author Woody
+ * @date 2025/1/7
+ */
+public class SensitiveListDeserializer extends JsonDeserializer<List<String>> {
+    @Override
+    public List<String> deserialize(JsonParser parser, DeserializationContext context) throws IOException {
+        List<String> values = parser.readValueAs(JacksonUtils.STRING_LIST_TYPE);
+        return DatabaseContextHolder.getDatabaseCipherHandler().decrypt(values, true);
+    }
+}

+ 25 - 0
framework-database/src/main/java/com/chelvc/framework/database/jackson/SensitiveListSerializer.java

@@ -0,0 +1,25 @@
+package com.chelvc.framework.database.jackson;
+
+import java.io.IOException;
+import java.util.List;
+
+import com.chelvc.framework.database.context.DatabaseContextHolder;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+/**
+ * 敏感字符串列表JSON序列化处理器
+ *
+ * @author Woody
+ * @date 2025/1/7
+ */
+public class SensitiveListSerializer extends JsonSerializer<List<String>> {
+    @Override
+    public void serialize(List<String> value, JsonGenerator generator, SerializerProvider provider) throws IOException {
+        if (DatabaseContextHolder.getDatabaseCipherHandler().isWritable()) {
+            value = DatabaseContextHolder.getDatabaseCipherHandler().encrypt(value, true);
+        }
+        generator.writeObject(value);
+    }
+}

+ 24 - 0
framework-database/src/main/java/com/chelvc/framework/database/jackson/SensitiveSerializer.java

@@ -0,0 +1,24 @@
+package com.chelvc.framework.database.jackson;
+
+import java.io.IOException;
+
+import com.chelvc.framework.database.context.DatabaseContextHolder;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+/**
+ * 敏感字符串JSON序列化处理器
+ *
+ * @author Woody
+ * @date 2025/1/7
+ */
+public class SensitiveSerializer extends JsonSerializer<String> {
+    @Override
+    public void serialize(String value, JsonGenerator generator, SerializerProvider provider) throws IOException {
+        if (DatabaseContextHolder.getDatabaseCipherHandler().isWritable()) {
+            value = DatabaseContextHolder.getDatabaseCipherHandler().encrypt(value, true);
+        }
+        generator.writeString(value);
+    }
+}

+ 24 - 0
framework-database/src/main/java/com/chelvc/framework/database/jackson/SensitiveSetDeserializer.java

@@ -0,0 +1,24 @@
+package com.chelvc.framework.database.jackson;
+
+import java.io.IOException;
+import java.util.Set;
+
+import com.chelvc.framework.common.util.JacksonUtils;
+import com.chelvc.framework.database.context.DatabaseContextHolder;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+
+/**
+ * 敏感字符串集合JSON反序列化处理器
+ *
+ * @author Woody
+ * @date 2025/1/7
+ */
+public class SensitiveSetDeserializer extends JsonDeserializer<Set<String>> {
+    @Override
+    public Set<String> deserialize(JsonParser parser, DeserializationContext context) throws IOException {
+        Set<String> values = parser.readValueAs(JacksonUtils.STRING_SET_TYPE);
+        return DatabaseContextHolder.getDatabaseCipherHandler().decrypt(values, true);
+    }
+}

+ 25 - 0
framework-database/src/main/java/com/chelvc/framework/database/jackson/SensitiveSetSerializer.java

@@ -0,0 +1,25 @@
+package com.chelvc.framework.database.jackson;
+
+import java.io.IOException;
+import java.util.Set;
+
+import com.chelvc.framework.database.context.DatabaseContextHolder;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+/**
+ * 敏感字符串集合JSON序列化处理器
+ *
+ * @author Woody
+ * @date 2025/1/7
+ */
+public class SensitiveSetSerializer extends JsonSerializer<Set<String>> {
+    @Override
+    public void serialize(Set<String> value, JsonGenerator generator, SerializerProvider provider) throws IOException {
+        if (DatabaseContextHolder.getDatabaseCipherHandler().isWritable()) {
+            value = DatabaseContextHolder.getDatabaseCipherHandler().encrypt(value, true);
+        }
+        generator.writeObject(value);
+    }
+}

+ 0 - 5
framework-elasticsearch/src/main/java/com/chelvc/framework/elasticsearch/DefaultElasticsearchHandler.java

@@ -193,11 +193,6 @@ public class DefaultElasticsearchHandler implements ElasticsearchHandler {
         return this.update(model, id, document, null, null);
     }
 
-    @Override
-    public <T> UpdateByQueryResponse update(@NonNull Class<T> model, @NonNull Query query, @NonNull T document) {
-        return this.update(model, query, ObjectUtils.object2map(document));
-    }
-
     @Override
     public UpdateByQueryResponse update(@NonNull Class<?> model, @NonNull Query query, @NonNull String field,
                                         Object value) {

+ 0 - 11
framework-elasticsearch/src/main/java/com/chelvc/framework/elasticsearch/ElasticsearchHandler.java

@@ -121,17 +121,6 @@ public interface ElasticsearchHandler {
      */
     <T> UpdateResponse<T> update(Class<T> model, String id, Object document);
 
-    /**
-     * 更新文档
-     *
-     * @param model    数据模型
-     * @param query    过滤条件
-     * @param document 文档信息
-     * @param <T>      数据类型
-     * @return 响应结果
-     */
-    <T> UpdateByQueryResponse update(Class<T> model, Query query, T document);
-
     /**
      * 更新文档
      *

+ 22 - 1
framework-security/src/main/java/com/chelvc/framework/security/crypto/DefaultSecurityCipherHandler.java

@@ -19,11 +19,32 @@ public class DefaultSecurityCipherHandler extends AbstractSecurityCipherHandler
 
     public DefaultSecurityCipherHandler(@NonNull SecurityProperties.Crypto properties) {
         super(properties);
-        String name = AESUtils.CBC_PKCS5PADDING, iv = AESUtils.str2iv(this.secret);
+        String name = AESUtils.CBC_PKCS5PADDING, iv = this.str2iv(this.secret);
         this.encryptor = StringUtils.isEmpty(this.secret) ? null : AESUtils.getEncryptor(name, this.secret, iv);
         this.decrypter = StringUtils.isEmpty(this.secret) ? null : AESUtils.getDecrypter(name, this.secret, iv);
     }
 
+    /**
+     * 根据字符串获取向量
+     *
+     * @param str 字符串
+     * @return 向量
+     */
+    private String str2iv(String str) {
+        if (StringUtils.isEmpty(str)) {
+            return str;
+        }
+        int size = Math.min(str.length(), 16);
+        if (size == 1) {
+            return str;
+        }
+        StringBuilder iv = new StringBuilder(size);
+        for (int i = str.length() - 1, max = 0; i >= 0 && max < size; i--, max++) {
+            iv.append(str.charAt(i));
+        }
+        return iv.toString();
+    }
+
     @Override
     public byte[] encrypt(byte[] bytes) {
         return CodecUtils.codec(this.encryptor, bytes);