From a9b9475fa356db7603ecbc1b4276dc10d0c08d8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sat, 20 Jul 2024 09:36:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=97=A5=E5=BF=97=E7=AE=A1=E7=90=86):=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20Jackson=20json=20=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=84=B1=E6=95=8F=E5=B7=A5=E5=85=B7=E7=B1=BB=EF=BC=8C=E5=A6=82?= =?UTF-8?q?=E6=9E=9C=E6=97=A5=E5=BF=97=E5=85=A5=E5=BA=93=E4=B8=AD=E6=9C=89?= =?UTF-8?q?=E6=95=8F=E6=84=9F=E5=AD=97=E6=AE=B5=E5=88=99=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit a7a5b33c1270e99b01a65307926e98f27c9da3fb) --- .../common/log/config/PigxLogProperties.java | 36 +++---- .../pigx/common/log/event/SysLogListener.java | 95 ++++++++----------- .../log/util/JacksonSensitiveFieldUtil.java | 63 ++++++++++++ .../pigx/admin/mapper/SysLogMapper.java | 3 - .../admin/service/impl/SysLogServiceImpl.java | 1 + 5 files changed, 121 insertions(+), 77 deletions(-) create mode 100644 pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/JacksonSensitiveFieldUtil.java diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/config/PigxLogProperties.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/config/PigxLogProperties.java index 4b500ad92..57a2235dc 100644 --- a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/config/PigxLogProperties.java +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/config/PigxLogProperties.java @@ -33,27 +33,27 @@ import java.util.List; @ConfigurationProperties(PigxLogProperties.PREFIX) public class PigxLogProperties { - public static final String PREFIX = "pigx.log"; + public static final String PREFIX = "pigx.log"; - /** - * 开启日志记录 - */ - private boolean enabled = true; + /** + * 开启日志记录 + */ + private boolean enabled = true; - /** - * 记录请求报文体 - */ - private boolean requestEnabled = true; + /** + * 记录请求报文体 + */ + private boolean requestEnabled = true; - /** - * 放行字段,password,mobile,idcard,phone - */ - @Value("${pigx.log.exclude-fields:password,mobile,idcard,phone}") - private List excludeFields; + /** + * 放行字段,password,mobile,idcard,phone + */ + @Value("${pigx.log.exclude-fields:password,mobile,idcard,phone,accessSecret,tokenId,sign}") + private List excludeFields; - /** - * 请求报文最大存储长度 - */ - private Integer maxLength = 2000; + /** + * 请求报文最大存储长度 + */ + private Integer maxLength = 2000; } diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/event/SysLogListener.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/event/SysLogListener.java index ed92f6ed0..ebbf9994f 100755 --- a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/event/SysLogListener.java +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/event/SysLogListener.java @@ -18,16 +18,11 @@ package com.pig4cloud.pigx.common.log.event; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import com.fasterxml.jackson.annotation.JsonFilter; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ser.FilterProvider; -import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; -import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; import com.pig4cloud.pigx.admin.api.dto.SysLogDTO; import com.pig4cloud.pigx.admin.api.feign.RemoteLogService; -import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import com.pig4cloud.pigx.common.core.jackson.PigxJavaTimeModule; import com.pig4cloud.pigx.common.log.config.PigxLogProperties; +import com.pig4cloud.pigx.common.log.util.JacksonSensitiveFieldUtil; import jakarta.servlet.ServletRequest; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; @@ -49,62 +44,50 @@ import java.util.Objects; @RequiredArgsConstructor public class SysLogListener implements InitializingBean { - /** - * 忽略序列化的对象类型 - */ - private final static Class[] ignoreClass = { ServletRequest.class, BindingResult.class }; + /** + * 忽略序列化的对象类型 + */ + private final static Class[] ignoreClass = {ServletRequest.class, BindingResult.class}; - /** - * new 一个 避免日志脱敏策略影响全局ObjectMapper - */ - private final static ObjectMapper objectMapper = new ObjectMapper(); + /** + * new 一个 避免日志脱敏策略影响全局ObjectMapper + */ - private final RemoteLogService remoteLogService; + private final RemoteLogService remoteLogService; - private final PigxLogProperties logProperties; + private final PigxLogProperties logProperties; - @SneakyThrows - @Async - @Order - @EventListener(SysLogEvent.class) - public void saveSysLog(SysLogEvent event) { - SysLogDTO source = (SysLogDTO) event.getSource(); + @SneakyThrows + @Async + @Order + @EventListener(SysLogEvent.class) + public void saveSysLog(SysLogEvent event) { + SysLogDTO source = (SysLogDTO) event.getSource(); - // json 格式刷参数放在异步中处理,提升性能 - if (Objects.nonNull(source.getBody()) && logProperties.isRequestEnabled()) { - Object[] args = (Object[]) source.getBody(); - List list = CollUtil.toList(args); - // 删除部分无法序列化的参数 - list.removeIf(obj -> Arrays.stream(ignoreClass).anyMatch(clazz -> clazz.isAssignableFrom(obj.getClass()))); + // json 格式刷参数放在异步中处理,提升性能 + if (Objects.nonNull(source.getBody()) && logProperties.isRequestEnabled()) { + Object[] args = (Object[]) source.getBody(); + List list = CollUtil.toList(args); + // 删除部分无法序列化的参数 + list.removeIf(obj -> Arrays.stream(ignoreClass).anyMatch(clazz -> clazz.isAssignableFrom(obj.getClass()))); - try { - // 序列化参数 - String params = objectMapper.writeValueAsString(list); - source.setParams(StrUtil.subPre(params, logProperties.getMaxLength())); - } - catch (Exception e) { - log.error("请求参数序列化异常:{}", e.getMessage()); - } - } + try { + // 序列化参数 + String params = JacksonSensitiveFieldUtil.getObjectMapper().writeValueAsString(list); + source.setParams(StrUtil.subPre(params, logProperties.getMaxLength())); + } catch (Exception e) { + log.error("请求参数序列化异常:{}", e.getMessage()); + } + } - source.setBody(null); - remoteLogService.saveLog(source, SecurityConstants.FROM_IN); - } - - @Override - public void afterPropertiesSet() { - objectMapper.addMixIn(Object.class, PropertyFilterMixIn.class); - String[] ignorableFieldNames = logProperties.getExcludeFields().toArray(new String[0]); - - FilterProvider filters = new SimpleFilterProvider().addFilter("filter properties by name", - SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames)); - objectMapper.setFilterProvider(filters); - objectMapper.registerModule(new PigxJavaTimeModule()); - } - - @JsonFilter("filter properties by name") - class PropertyFilterMixIn { - - } + source.setBody(null); + remoteLogService.saveLog(source); + } + @Override + public void afterPropertiesSet() { + String[] ignorableFieldNames = logProperties.getExcludeFields().toArray(new String[0]); + JacksonSensitiveFieldUtil.configureSensitiveFields(ignorableFieldNames); + JacksonSensitiveFieldUtil.registerCustomModule(new PigxJavaTimeModule()); + } } diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/JacksonSensitiveFieldUtil.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/JacksonSensitiveFieldUtil.java new file mode 100644 index 000000000..af0099853 --- /dev/null +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/JacksonSensitiveFieldUtil.java @@ -0,0 +1,63 @@ +package com.pig4cloud.pigx.common.log.util; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ser.FilterProvider; +import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; +import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; +import lombok.Getter; +import lombok.SneakyThrows; + +/** + * Jackson 脱敏 + * + * @author lengleng + * @date 2024/07/18 + */ +public class JacksonSensitiveFieldUtil { + + @Getter + private static final ObjectMapper objectMapper = new ObjectMapper(); + + static { + objectMapper.addMixIn(Object.class, PropertyFilterMixIn.class); + } + + public static void configureSensitiveFields(String[] ignorableFieldNames) { + FilterProvider filters = new SimpleFilterProvider().addFilter("filter properties by name", + SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames)); + objectMapper.setFilterProvider(filters); + } + + public static void registerCustomModule(com.fasterxml.jackson.databind.Module module) { + objectMapper.registerModule(module); + } + + /** + * string -> object + * + * @param content 内容 + * @param valueType 值类型 + * @return {@link T } + */ + @SneakyThrows + public static T readValue(String content, Class valueType) { + return objectMapper.readValue(content, valueType); + } + + /** + * string -> string + * + * @param content 内容 + * @return {@link String } + */ + @SneakyThrows + public static String readStr(String content) { + Object o = objectMapper.readValue(content, Object.class); + return objectMapper.writeValueAsString(o); + } + + @JsonFilter("filter properties by name") + private static class PropertyFilterMixIn { + } +} diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysLogMapper.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysLogMapper.java index 985fd1d2a..d6d84f549 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysLogMapper.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysLogMapper.java @@ -23,9 +23,6 @@ import com.pig4cloud.pigx.admin.api.entity.SysLog; import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; import org.apache.ibatis.annotations.Mapper; -import java.util.List; -import java.util.Map; - /** *

* 日志表 Mapper 接口 diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysLogServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysLogServiceImpl.java index 290bae475..5a2273ce0 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysLogServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysLogServiceImpl.java @@ -89,6 +89,7 @@ public class SysLogServiceImpl extends ServiceImpl impleme .le(SysLog::getCreateTime, sysLog.getCreateTime()[1]); } + wrapper.eq(StrUtil.isNotBlank(sysLog.getServiceId()), SysLog::getServiceId, sysLog.getServiceId()); return baseMapper.selectPage(page, wrapper); }