字段加密解密功能测试

ccongli-dev-0811
LI-CCONG\李聪聪 1 year ago
parent f68b58448c
commit aa4c6b5c86

@ -67,6 +67,7 @@ public class EncryptTypeHandler extends BaseTypeHandler<String> {
} }
// 构建 AES // 构建 AES
String password = SpringUtil.getProperty(ENCRYPTOR_PROPERTY_NAME); String password = SpringUtil.getProperty(ENCRYPTOR_PROPERTY_NAME);
// String password = Optional.ofNullable(SpringUtil.getProperty(ENCRYPTOR_PROPERTY_NAME)).orElse("X+aZvWkl9jtRP9b2");
Assert.notEmpty(password, "配置项({}) 不能为空", ENCRYPTOR_PROPERTY_NAME); Assert.notEmpty(password, "配置项({}) 不能为空", ENCRYPTOR_PROPERTY_NAME);
aes = SecureUtil.aes(password.getBytes()); aes = SecureUtil.aes(password.getBytes());
return aes; return aes;

@ -2,11 +2,13 @@ package com.yunxi.scm.module.demo.controller.admin;
import com.yunxi.scm.framework.common.pojo.CommonResult; import com.yunxi.scm.framework.common.pojo.CommonResult;
import com.yunxi.scm.framework.excel.core.util.ExcelUtils; import com.yunxi.scm.framework.excel.core.util.ExcelUtils;
import com.yunxi.scm.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.yunxi.scm.framework.operatelog.core.annotations.OperateLog; import com.yunxi.scm.framework.operatelog.core.annotations.OperateLog;
import com.yunxi.scm.module.demo.controller.admin.material.vo.MaterialExportTestVO; import com.yunxi.scm.module.demo.controller.admin.material.vo.MaterialExportTestVO;
import com.yunxi.scm.module.demo.controller.admin.material.vo.MaterialImportTestVO; import com.yunxi.scm.module.demo.controller.admin.material.vo.MaterialImportTestVO;
import com.yunxi.scm.module.demo.convert.material.MaterialConvert; import com.yunxi.scm.module.demo.convert.material.MaterialXConvert;
import com.yunxi.scm.module.demo.dal.dataobject.material.MaterialXDO; import com.yunxi.scm.module.demo.dal.dataobject.material.MaterialXDO;
import com.yunxi.scm.module.demo.dal.mysql.material.MaterialXMapper;
import com.yunxi.scm.module.demo.enums.material.CategoryEnum; import com.yunxi.scm.module.demo.enums.material.CategoryEnum;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
@ -16,6 +18,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.annotation.security.PermitAll; import javax.annotation.security.PermitAll;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
@ -23,6 +26,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
import static com.yunxi.scm.framework.common.pojo.CommonResult.success; import static com.yunxi.scm.framework.common.pojo.CommonResult.success;
import static com.yunxi.scm.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; import static com.yunxi.scm.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@ -47,12 +51,12 @@ public class DemoTestController {
@PermitAll @PermitAll
@OperateLog(type = EXPORT) @OperateLog(type = EXPORT)
public void testExport(HttpServletResponse response) throws IOException { public void testExport(HttpServletResponse response) throws IOException {
MaterialXDO xdo1 = new MaterialXDO(Arrays.asList("1","2")); MaterialXDO xdo1 = new MaterialXDO(1L,"80inu5yxl3",Arrays.asList("1","2"));
MaterialXDO xdo2 = new MaterialXDO(Arrays.asList("1","3")); MaterialXDO xdo2 = new MaterialXDO(2L,"Q2ZY1I9cCBf0YKvDUlzCbw==",Arrays.asList("1","3"));
List<MaterialXDO> xdos = new ArrayList<>(); List<MaterialXDO> xdos = new ArrayList<>();
xdos.add(xdo1); xdos.add(xdo1);
xdos.add(xdo2); xdos.add(xdo2);
List<MaterialExportTestVO> datas = MaterialConvert.INSTANCE.convertList03(xdos); List<MaterialExportTestVO> datas = MaterialXConvert.INSTANCE.convertList03(xdos);
ExcelUtils.write(response, "测试导出.xls", "数据", MaterialExportTestVO.class, datas); ExcelUtils.write(response, "测试导出.xls", "数据", MaterialExportTestVO.class, datas);
} }
@ -76,8 +80,8 @@ public class DemoTestController {
@PermitAll @PermitAll
@Operation(summary = "获得导入模板") @Operation(summary = "获得导入模板")
public void importTemplate(HttpServletResponse response) throws IOException { public void importTemplate(HttpServletResponse response) throws IOException {
List<String> values = Arrays.asList(CategoryEnum.COMMON.getCode(),CategoryEnum.KANJIA.getCode()) List<String> values = Stream.of(CategoryEnum.COMMON.getCode(),CategoryEnum.KANJIA.getCode())
.stream().map(v-> String.valueOf(v)).collect(Collectors.toList()); .map(String::valueOf).collect(Collectors.toList());
// 手动创建导出 demo // 手动创建导出 demo
List<MaterialImportTestVO> list = Arrays.asList( List<MaterialImportTestVO> list = Arrays.asList(
MaterialImportTestVO.builder().category(values).build() MaterialImportTestVO.builder().category(values).build()
@ -85,4 +89,31 @@ public class DemoTestController {
// 输出 // 输出
ExcelUtils.write(response, "导入模板.xls", "物料标准模版", MaterialImportTestVO.class, list); ExcelUtils.write(response, "导入模板.xls", "物料标准模版", MaterialImportTestVO.class, list);
} }
@Resource
MaterialXMapper materialXMapper;
@GetMapping("/test_encrypt")
@Operation(summary = "测试字段加密")
@PermitAll
public CommonResult<String> testEncrypt() {
MaterialXDO xdo1 = new MaterialXDO(1L,"80inu5yxl3",Arrays.asList("1","2"));
MaterialXDO xdo2 = new MaterialXDO(2L,"80inu5yxl3",Arrays.asList("1","3"));
List<MaterialXDO> xdos = new ArrayList<>();
xdos.add(xdo1);
xdos.add(xdo2);
materialXMapper.insertBatch(xdos);
return success("ok");
}
@GetMapping("/test_decrypt")
@Operation(summary = "测试字段解密")
@PermitAll
public CommonResult<MaterialExportTestVO> testDecrypt() {
LambdaQueryWrapperX<MaterialXDO> wrapperX = new LambdaQueryWrapperX<>();
wrapperX.eq(MaterialXDO::getId, 1);
MaterialXDO xdo = materialXMapper.selectOne(wrapperX);
return success(MaterialXConvert.INSTANCE.convert(xdo));
}
} }

@ -12,6 +12,9 @@ import java.util.List;
@Data @Data
public class MaterialExportTestVO { public class MaterialExportTestVO {
@ExcelProperty(value = "密码")
private String password;
@ExcelProperty(value = "分类测试", converter = MutilDictConvert.class) @ExcelProperty(value = "分类测试", converter = MutilDictConvert.class)
@DictFormat(DictTypeConstants.TRADE_ORDER_TYPE) @DictFormat(DictTypeConstants.TRADE_ORDER_TYPE)
private List<String> category; private List<String> category;

@ -0,0 +1,24 @@
package com.yunxi.scm.module.demo.convert.material;
import com.yunxi.scm.module.demo.controller.admin.material.vo.MaterialExportTestVO;
import com.yunxi.scm.module.demo.dal.dataobject.material.MaterialXDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* Convert
*
* @author ccongli
*/
@Mapper
public interface MaterialXConvert {
MaterialXConvert INSTANCE = Mappers.getMapper(MaterialXConvert.class);
MaterialExportTestVO convert(MaterialXDO xdo);
List<MaterialExportTestVO> convertList03(List<MaterialXDO> list);
}

@ -1,15 +1,30 @@
package com.yunxi.scm.module.demo.dal.dataobject.material; package com.yunxi.scm.module.demo.dal.dataobject.material;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yunxi.scm.framework.mybatis.core.type.EncryptTypeHandler;
import com.yunxi.scm.framework.mybatis.core.type.StringListTypeHandler;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List; import java.util.List;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class MaterialXDO { @TableName(value = "demo_xxx", autoResultMap = true)
public class MaterialXDO implements Serializable {
@TableId
private Long id;
// 字段加密注解
@TableField(typeHandler = EncryptTypeHandler.class)
private String password;
@TableField(typeHandler = StringListTypeHandler.class)
private List<String> category; private List<String> category;
} }

@ -0,0 +1,15 @@
package com.yunxi.scm.module.demo.dal.mysql.material;
import com.yunxi.scm.framework.mybatis.core.mapper.BaseMapperX;
import com.yunxi.scm.module.demo.dal.dataobject.material.MaterialXDO;
import org.apache.ibatis.annotations.Mapper;
/**
* Mapper
*
* @author ccongli
*/
@Mapper
public interface MaterialXMapper extends BaseMapperX<MaterialXDO> {
}

@ -1,8 +1,9 @@
package com.yunxi.scm.module.infra.service.db; package com.yunxi.scm.module.infra.service.db;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.crypto.symmetric.AES; import cn.hutool.crypto.symmetric.AES;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import com.yunxi.scm.framework.mybatis.core.type.EncryptTypeHandler; import com.yunxi.scm.framework.mybatis.core.type.EncryptTypeHandler;
import com.yunxi.scm.framework.mybatis.core.util.JdbcUtils; import com.yunxi.scm.framework.mybatis.core.util.JdbcUtils;
import com.yunxi.scm.framework.test.core.ut.BaseDbUnitTest; import com.yunxi.scm.framework.test.core.ut.BaseDbUnitTest;
@ -10,12 +11,9 @@ import com.yunxi.scm.module.infra.controller.admin.db.vo.DataSourceConfigCreateR
import com.yunxi.scm.module.infra.controller.admin.db.vo.DataSourceConfigUpdateReqVO; import com.yunxi.scm.module.infra.controller.admin.db.vo.DataSourceConfigUpdateReqVO;
import com.yunxi.scm.module.infra.dal.dataobject.db.DataSourceConfigDO; import com.yunxi.scm.module.infra.dal.dataobject.db.DataSourceConfigDO;
import com.yunxi.scm.module.infra.dal.mysql.db.DataSourceConfigMapper; import com.yunxi.scm.module.infra.dal.mysql.db.DataSourceConfigMapper;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic; import org.mockito.MockedStatic;
import org.mockito.stubbing.Answer;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Import;
@ -28,7 +26,6 @@ import static com.yunxi.scm.framework.test.core.util.RandomUtils.randomLongId;
import static com.yunxi.scm.framework.test.core.util.RandomUtils.randomPojo; import static com.yunxi.scm.framework.test.core.util.RandomUtils.randomPojo;
import static com.yunxi.scm.module.infra.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_EXISTS; import static com.yunxi.scm.module.infra.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_EXISTS;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@ -56,9 +53,9 @@ public class DataSourceConfigServiceImplTest extends BaseDbUnitTest {
@BeforeEach @BeforeEach
public void setUp() { public void setUp() {
// mock 一个空实现的 StringEncryptor避免 EncryptTypeHandler 报错 // mock 一个空实现的 StringEncryptor避免 EncryptTypeHandler 报错
ReflectUtil.setFieldValue(EncryptTypeHandler.class, "aes", aes); // ReflectUtil.setFieldValue(EncryptTypeHandler.class, "aes", aes);
when(aes.encryptBase64(anyString())).then((Answer<String>) invocation -> invocation.getArgument(0)); // when(aes.encryptBase64(anyString())).then((Answer<String>) invocation -> invocation.getArgument(0));
when(aes.decryptStr(anyString())).then((Answer<String>) invocation -> invocation.getArgument(0)); // when(aes.decryptStr(anyString())).then((Answer<String>) invocation -> invocation.getArgument(0));
// mock DynamicDataSourceProperties // mock DynamicDataSourceProperties
when(dynamicDataSourceProperties.getPrimary()).thenReturn("primary"); when(dynamicDataSourceProperties.getPrimary()).thenReturn("primary");
@ -145,6 +142,8 @@ public class DataSourceConfigServiceImplTest extends BaseDbUnitTest {
DataSourceConfigDO dbDataSourceConfig = randomPojo(DataSourceConfigDO.class); DataSourceConfigDO dbDataSourceConfig = randomPojo(DataSourceConfigDO.class);
dataSourceConfigMapper.insert(dbDataSourceConfig);// @Sql: 先插入出一条存在的数据 dataSourceConfigMapper.insert(dbDataSourceConfig);// @Sql: 先插入出一条存在的数据
System.out.println(dbDataSourceConfig.getPassword());
System.out.println(EncryptTypeHandler.encrypt(dbDataSourceConfig.getPassword()));
// 调用 // 调用
DataSourceConfigDO result = dataSourceConfigMapper.selectOne(DataSourceConfigDO::getPassword, DataSourceConfigDO result = dataSourceConfigMapper.selectOne(DataSourceConfigDO::getPassword,
EncryptTypeHandler.encrypt(dbDataSourceConfig.getPassword())); EncryptTypeHandler.encrypt(dbDataSourceConfig.getPassword()));

@ -29,6 +29,8 @@ spring:
mybatis-plus: mybatis-plus:
lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试
type-aliases-package: ${yunxi.info.base-package}.module.*.dal.dataobject type-aliases-package: ${yunxi.info.base-package}.module.*.dal.dataobject
encryptor:
password: X+aZvWkl9jtRP9b2
--- #################### 定时任务相关配置 #################### --- #################### 定时任务相关配置 ####################

@ -194,6 +194,7 @@ yunxi:
- rep_demo_jianpiao - rep_demo_jianpiao
- tmp_report_data_1 - tmp_report_data_1
- tmp_report_data_income - tmp_report_data_income
- demo_xxx
sms-code: # 短信验证码相关的配置项 sms-code: # 短信验证码相关的配置项
expire-times: 10m expire-times: 10m
send-frequency: 1m send-frequency: 1m

Loading…
Cancel
Save