|
@@ -15,14 +15,13 @@ import java.util.List;
|
|
|
import java.util.Set;
|
|
|
|
|
|
import com.chelvc.framework.common.annotation.Sensitive;
|
|
|
+import com.chelvc.framework.common.util.AESUtils;
|
|
|
import com.chelvc.framework.common.util.JacksonUtils;
|
|
|
import com.chelvc.framework.common.util.ObjectUtils;
|
|
|
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.fasterxml.jackson.core.Version;
|
|
|
-import com.fasterxml.jackson.databind.AnnotationIntrospector;
|
|
|
import com.fasterxml.jackson.databind.DeserializationContext;
|
|
|
import com.fasterxml.jackson.databind.JavaType;
|
|
|
import com.fasterxml.jackson.databind.JsonDeserializer;
|
|
@@ -30,6 +29,7 @@ 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;
|
|
|
import lombok.NonNull;
|
|
|
import org.apache.ibatis.executor.result.ResultMapException;
|
|
@@ -52,50 +52,50 @@ 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.isSensitiveWritable()) {
|
|
|
- value = DatabaseContextHolder.encrypt(value, true);
|
|
|
+ if (DatabaseContextHolder.isSensitiveWritable() && value != null) {
|
|
|
+ value = AESUtils.encrypt(DatabaseContextHolder.getEncryptor(), value);
|
|
|
}
|
|
|
generator.writeString(value);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 敏感字符串集合序列化处理器
|
|
|
+ * 敏感字符串数组序列化处理器
|
|
|
*/
|
|
|
- class SensitiveSetSerializer extends JsonSerializer<Set<String>> {
|
|
|
+ class SensitiveArraySerializer extends JsonSerializer<String[]> {
|
|
|
@Override
|
|
|
- public void serialize(Set<String> value, JsonGenerator generator, SerializerProvider provider)
|
|
|
+ public void serialize(String[] value, JsonGenerator generator, SerializerProvider provider)
|
|
|
throws IOException {
|
|
|
- if (DatabaseContextHolder.isSensitiveWritable()) {
|
|
|
- value = DatabaseContextHolder.encrypt(value, true);
|
|
|
+ if (DatabaseContextHolder.isSensitiveWritable() && ObjectUtils.notEmpty(value)) {
|
|
|
+ value = AESUtils.encrypt(DatabaseContextHolder.getEncryptor(), value);
|
|
|
}
|
|
|
generator.writeObject(value);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 敏感字符串列表序列化处理器
|
|
|
+ * 敏感字符串集合序列化处理器
|
|
|
*/
|
|
|
- class SensitiveListSerializer extends JsonSerializer<List<String>> {
|
|
|
+ class SensitiveSetSerializer extends JsonSerializer<Set<String>> {
|
|
|
@Override
|
|
|
- public void serialize(List<String> value, JsonGenerator generator, SerializerProvider provider)
|
|
|
+ public void serialize(Set<String> value, JsonGenerator generator, SerializerProvider provider)
|
|
|
throws IOException {
|
|
|
- if (DatabaseContextHolder.isSensitiveWritable()) {
|
|
|
- value = DatabaseContextHolder.encrypt(value, true);
|
|
|
+ if (DatabaseContextHolder.isSensitiveWritable() && ObjectUtils.notEmpty(value)) {
|
|
|
+ value = AESUtils.encrypt(DatabaseContextHolder.getEncryptor(), value);
|
|
|
}
|
|
|
generator.writeObject(value);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 敏感字符串数组序列化处理器
|
|
|
+ * 敏感字符串列表序列化处理器
|
|
|
*/
|
|
|
- class SensitiveArraySerializer extends JsonSerializer<String[]> {
|
|
|
+ class SensitiveListSerializer extends JsonSerializer<List<String>> {
|
|
|
@Override
|
|
|
- public void serialize(String[] value, JsonGenerator generator, SerializerProvider provider)
|
|
|
+ public void serialize(List<String> value, JsonGenerator generator, SerializerProvider provider)
|
|
|
throws IOException {
|
|
|
- if (DatabaseContextHolder.isSensitiveWritable()) {
|
|
|
- value = DatabaseContextHolder.encrypt(value, true);
|
|
|
+ if (DatabaseContextHolder.isSensitiveWritable() && ObjectUtils.notEmpty(value)) {
|
|
|
+ value = AESUtils.encrypt(DatabaseContextHolder.getEncryptor(), value);
|
|
|
}
|
|
|
generator.writeObject(value);
|
|
|
}
|
|
@@ -108,7 +108,27 @@ public interface JsonTypeHandler<T> extends TypeHandler<T> {
|
|
|
@Override
|
|
|
public String deserialize(JsonParser parser, DeserializationContext context)
|
|
|
throws IOException, JsonProcessingException {
|
|
|
- return DatabaseContextHolder.decrypt(parser.getValueAsString(), true);
|
|
|
+ String value = parser.getValueAsString();
|
|
|
+ return value == null ? null : AESUtils.decrypt(DatabaseContextHolder.getDecrypter(), value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 敏感字符串数组反序列化处理器
|
|
|
+ */
|
|
|
+ class SensitiveArrayDeserializer extends JsonDeserializer<String[]> {
|
|
|
+ private static final com.fasterxml.jackson.core.type.TypeReference<String[]> TYPE =
|
|
|
+ new com.fasterxml.jackson.core.type.TypeReference<String[]>() {
|
|
|
+ };
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String[] deserialize(JsonParser parser, DeserializationContext context)
|
|
|
+ throws IOException, JsonProcessingException {
|
|
|
+ String[] values = parser.readValueAs(TYPE);
|
|
|
+ if (ObjectUtils.isEmpty(values)) {
|
|
|
+ return values;
|
|
|
+ }
|
|
|
+ return AESUtils.decrypt(DatabaseContextHolder.getDecrypter(), values);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -124,7 +144,10 @@ public interface JsonTypeHandler<T> extends TypeHandler<T> {
|
|
|
public Set<String> deserialize(JsonParser parser, DeserializationContext context)
|
|
|
throws IOException, JsonProcessingException {
|
|
|
Set<String> values = parser.readValueAs(TYPE);
|
|
|
- return DatabaseContextHolder.decrypt(values, true);
|
|
|
+ if (ObjectUtils.isEmpty(values)) {
|
|
|
+ return values;
|
|
|
+ }
|
|
|
+ return AESUtils.decrypt(DatabaseContextHolder.getDecrypter(), values);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -140,97 +163,81 @@ public interface JsonTypeHandler<T> extends TypeHandler<T> {
|
|
|
public List<String> deserialize(JsonParser parser, DeserializationContext context)
|
|
|
throws IOException, JsonProcessingException {
|
|
|
List<String> values = parser.readValueAs(TYPE);
|
|
|
- return DatabaseContextHolder.decrypt(values, true);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 敏感字符串数组反序列化处理器
|
|
|
- */
|
|
|
- class SensitiveArrayDeserializer extends JsonDeserializer<String[]> {
|
|
|
- private static final com.fasterxml.jackson.core.type.TypeReference<String[]> TYPE =
|
|
|
- new com.fasterxml.jackson.core.type.TypeReference<String[]>() {
|
|
|
- };
|
|
|
-
|
|
|
- @Override
|
|
|
- public String[] deserialize(JsonParser parser, DeserializationContext context)
|
|
|
- throws IOException, JsonProcessingException {
|
|
|
- String[] values = parser.readValueAs(TYPE);
|
|
|
- return DatabaseContextHolder.decrypt(values, true);
|
|
|
+ if (ObjectUtils.isEmpty(values)) {
|
|
|
+ return values;
|
|
|
+ }
|
|
|
+ return AESUtils.decrypt(DatabaseContextHolder.getDecrypter(), values);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 对象JSON序列化/反序列化处理器实例
|
|
|
*/
|
|
|
- ObjectMapper mapper = JacksonUtils.initializeSerializer().setAnnotationIntrospector(new AnnotationIntrospector() {
|
|
|
- @Override
|
|
|
- public Version version() {
|
|
|
- return Version.unknownVersion();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Object findSerializer(Annotated am) {
|
|
|
- if (!am.hasAnnotation(Sensitive.class)) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- JavaType type = am.getType();
|
|
|
- Class<?> raw = am.getRawType();
|
|
|
- if (raw == String.class) {
|
|
|
- return SensitiveSerializer.class;
|
|
|
- } else if (raw.isArray() && raw.getComponentType() == String.class) {
|
|
|
- return SensitiveArraySerializer.class;
|
|
|
- } else if (type instanceof CollectionType && type.getContentType().getRawClass() == String.class) {
|
|
|
- if (Set.class.isAssignableFrom(type.getRawClass())) {
|
|
|
- return SensitiveSetSerializer.class;
|
|
|
+ ObjectMapper mapper = JacksonUtils.initializeSerializer().setAnnotationIntrospector(
|
|
|
+ new JacksonAnnotationIntrospector() {
|
|
|
+ @Override
|
|
|
+ public Object findSerializer(Annotated am) {
|
|
|
+ if (!am.hasAnnotation(Sensitive.class)) {
|
|
|
+ return super.findSerializer(am);
|
|
|
+ }
|
|
|
+ JavaType type = am.getType();
|
|
|
+ Class<?> raw = am.getRawType();
|
|
|
+ if (raw == String.class) {
|
|
|
+ return SensitiveSerializer.class;
|
|
|
+ } else if (raw.isArray() && raw.getComponentType() == String.class) {
|
|
|
+ return SensitiveArraySerializer.class;
|
|
|
+ } else if (type instanceof CollectionType && type.getContentType().getRawClass() == String.class) {
|
|
|
+ if (Set.class.isAssignableFrom(type.getRawClass())) {
|
|
|
+ return SensitiveSetSerializer.class;
|
|
|
+ }
|
|
|
+ return SensitiveListSerializer.class;
|
|
|
+ }
|
|
|
+ return super.findSerializer(am);
|
|
|
}
|
|
|
- return SensitiveListSerializer.class;
|
|
|
- }
|
|
|
- return null;
|
|
|
- }
|
|
|
|
|
|
- @Override
|
|
|
- public Object findDeserializer(Annotated am) {
|
|
|
- if (!am.hasAnnotation(Sensitive.class)) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- AnnotatedElement element = am.getAnnotated();
|
|
|
- if (element instanceof Method) {
|
|
|
- Parameter[] parameters = ((Method) element).getParameters();
|
|
|
- if (ObjectUtils.notEmpty(parameters) && parameters.length > 0) {
|
|
|
- Type type = parameters[0].getParameterizedType();
|
|
|
- if (type == String.class) {
|
|
|
- return SensitiveDeserializer.class;
|
|
|
- } else if (type instanceof ParameterizedType) {
|
|
|
- Type raw = ((ParameterizedType) type).getRawType();
|
|
|
- Type arg = ((ParameterizedType) type).getActualTypeArguments()[0];
|
|
|
- if (raw == Set.class && arg == String.class) {
|
|
|
- return SensitiveSetDeserializer.class;
|
|
|
- } else if (raw == List.class && arg == String.class) {
|
|
|
+ @Override
|
|
|
+ public Object findDeserializer(Annotated am) {
|
|
|
+ if (!am.hasAnnotation(Sensitive.class)) {
|
|
|
+ return super.findDeserializer(am);
|
|
|
+ }
|
|
|
+ AnnotatedElement element = am.getAnnotated();
|
|
|
+ if (element instanceof Method) {
|
|
|
+ Parameter[] parameters = ((Method) element).getParameters();
|
|
|
+ if (ObjectUtils.notEmpty(parameters) && parameters.length > 0) {
|
|
|
+ Type type = parameters[0].getParameterizedType();
|
|
|
+ if (type == String.class) {
|
|
|
+ return SensitiveDeserializer.class;
|
|
|
+ } else if (type instanceof ParameterizedType) {
|
|
|
+ Type raw = ((ParameterizedType) type).getRawType();
|
|
|
+ Type arg = ((ParameterizedType) type).getActualTypeArguments()[0];
|
|
|
+ if (raw == Set.class && arg == String.class) {
|
|
|
+ return SensitiveSetDeserializer.class;
|
|
|
+ } else if (raw == List.class && arg == String.class) {
|
|
|
+ return SensitiveListDeserializer.class;
|
|
|
+ }
|
|
|
+ } else if (type instanceof Class<?> && ((Class<?>) type).isArray()
|
|
|
+ && ((Class<?>) type).getComponentType() == String.class) {
|
|
|
+ return SensitiveArrayDeserializer.class;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ JavaType type = am.getType();
|
|
|
+ Class<?> raw = am.getRawType();
|
|
|
+ if (raw == String.class) {
|
|
|
+ return SensitiveDeserializer.class;
|
|
|
+ } else if (raw.isArray() && raw.getComponentType() == String.class) {
|
|
|
+ return SensitiveArrayDeserializer.class;
|
|
|
+ } else if (type instanceof CollectionType
|
|
|
+ && type.getContentType().getRawClass() == String.class) {
|
|
|
+ if (Set.class.isAssignableFrom(type.getRawClass())) {
|
|
|
+ return SensitiveSetDeserializer.class;
|
|
|
+ }
|
|
|
return SensitiveListDeserializer.class;
|
|
|
}
|
|
|
- } else if (type instanceof Class<?> && ((Class<?>) type).isArray()
|
|
|
- && ((Class<?>) type).getComponentType() == String.class) {
|
|
|
- return SensitiveArrayDeserializer.class;
|
|
|
}
|
|
|
+ return super.findDeserializer(am);
|
|
|
}
|
|
|
- } else {
|
|
|
- JavaType type = am.getType();
|
|
|
- Class<?> raw = am.getRawType();
|
|
|
- if (raw == String.class) {
|
|
|
- return SensitiveDeserializer.class;
|
|
|
- } else if (raw.isArray() && raw.getComponentType() == String.class) {
|
|
|
- return SensitiveArrayDeserializer.class;
|
|
|
- } else if (type instanceof CollectionType && type.getContentType().getRawClass() == String.class) {
|
|
|
- if (Set.class.isAssignableFrom(type.getRawClass())) {
|
|
|
- return SensitiveSetDeserializer.class;
|
|
|
- }
|
|
|
- return SensitiveListDeserializer.class;
|
|
|
- }
|
|
|
- }
|
|
|
- return null;
|
|
|
- }
|
|
|
- });
|
|
|
+ });
|
|
|
|
|
|
/**
|
|
|
* 获取对象类型
|