From f17076e12811dd235e0c3e27619d7ea86b4cae3c Mon Sep 17 00:00:00 2001 From: kils Date: Wed, 24 Apr 2024 16:52:21 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AD=98=E5=82=A8=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=8F=8A=E8=8F=9C=E5=8D=95=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20(#52)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 存储管理功能优化: 1、私钥脱敏修改为注解/数据库敏感字段加密 2、兼容私钥脱敏修改场景下的数据回带 3、修复存储配置禁用情况下修改报错 || -> && 菜单管理优化: 1、非外链类型菜单兼容"/"路径 --- .../admin/system/model/entity/StorageDO.java | 3 ++ .../admin/system/model/resp/StorageResp.java | 9 ++-- .../service/impl/StorageServiceImpl.java | 44 +++++++++---------- .../admin/webapi/system/MenuController.java | 9 +++- 4 files changed, 36 insertions(+), 29 deletions(-) diff --git a/continew-admin-system/src/main/java/top/continew/admin/system/model/entity/StorageDO.java b/continew-admin-system/src/main/java/top/continew/admin/system/model/entity/StorageDO.java index 9b5a1c61..9a5f8fe0 100644 --- a/continew-admin-system/src/main/java/top/continew/admin/system/model/entity/StorageDO.java +++ b/continew-admin-system/src/main/java/top/continew/admin/system/model/entity/StorageDO.java @@ -21,6 +21,7 @@ import lombok.Data; import top.continew.admin.common.enums.DisEnableStatusEnum; import top.continew.admin.system.enums.StorageTypeEnum; import top.continew.starter.extension.crud.model.entity.BaseDO; +import top.continew.starter.security.crypto.annotation.FieldEncrypt; import java.io.Serial; @@ -55,11 +56,13 @@ public class StorageDO extends BaseDO { /** * Access Key(访问密钥) */ + @FieldEncrypt private String accessKey; /** * Secret Key(私有密钥) */ + @FieldEncrypt private String secretKey; /** diff --git a/continew-admin-system/src/main/java/top/continew/admin/system/model/resp/StorageResp.java b/continew-admin-system/src/main/java/top/continew/admin/system/model/resp/StorageResp.java index a2efe7f3..9bfde352 100644 --- a/continew-admin-system/src/main/java/top/continew/admin/system/model/resp/StorageResp.java +++ b/continew-admin-system/src/main/java/top/continew/admin/system/model/resp/StorageResp.java @@ -21,6 +21,7 @@ import lombok.Data; import top.continew.admin.common.enums.DisEnableStatusEnum; import top.continew.admin.system.enums.StorageTypeEnum; import top.continew.starter.extension.crud.model.resp.BaseDetailResp; +import top.continew.starter.security.mask.annotation.JsonMask; import java.io.Serial; @@ -71,14 +72,9 @@ public class StorageResp extends BaseDetailResp { * 私有密钥 */ @Schema(description = "私有密钥", example = "") + @JsonMask(left = 4, right = 3) private String secretKey; - /** - * 私有密钥加密串 - */ - @Schema(description = "私有密钥加密串", example = "") - private String secretKeyEncrypted; - /** * 终端节点 */ @@ -119,4 +115,5 @@ public class StorageResp extends BaseDetailResp { public Boolean getDisabled() { return this.getIsDefault(); } + } \ No newline at end of file diff --git a/continew-admin-system/src/main/java/top/continew/admin/system/service/impl/StorageServiceImpl.java b/continew-admin-system/src/main/java/top/continew/admin/system/service/impl/StorageServiceImpl.java index ef21cfa9..94eda67c 100644 --- a/continew-admin-system/src/main/java/top/continew/admin/system/service/impl/StorageServiceImpl.java +++ b/continew-admin-system/src/main/java/top/continew/admin/system/service/impl/StorageServiceImpl.java @@ -22,6 +22,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.URLUtil; import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.x.file.storage.core.FileStorageProperties; import org.dromara.x.file.storage.core.FileStorageService; import org.dromara.x.file.storage.core.FileStorageServiceBuilder; @@ -57,51 +58,33 @@ import java.util.concurrent.CopyOnWriteArrayList; */ @Service @RequiredArgsConstructor +@Slf4j public class StorageServiceImpl extends BaseServiceImpl implements StorageService { private final FileStorageService fileStorageService; @Resource private FileService fileService; - @Override - protected void fill(Object obj) { - super.fill(obj); - if (obj instanceof StorageResp resp && StrUtil.isNotBlank(resp.getSecretKey())) { - resp.setSecretKeyEncrypted(SecureUtils.encryptByRsaPublicKey(resp.getSecretKey())); - resp.setSecretKey(StrUtil.hide(resp.getSecretKey(), 4, resp.getSecretKey().length() - 3)); - } - - } - @Override protected void beforeAdd(StorageReq req) { - decryptSecretKey(req); + decodeSecretKey(req, null); CheckUtils.throwIf(Boolean.TRUE.equals(req.getIsDefault()) && this.isDefaultExists(null), "请先取消原有默认存储"); String code = req.getCode(); CheckUtils.throwIf(this.isCodeExists(code, null), "新增失败,[{}] 已存在", code); this.load(req); } - private void decryptSecretKey(StorageReq req) { - if (!StorageTypeEnum.S3.equals(req.getType())) { - return; - } - String secretKey = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(req.getSecretKey())); - ValidationUtils.throwIfNull(secretKey, "密钥解密失败"); - req.setSecretKey(secretKey); - } - @Override protected void beforeUpdate(StorageReq req, Long id) { - decryptSecretKey(req); String code = req.getCode(); CheckUtils.throwIf(this.isCodeExists(code, id), "修改失败,[{}] 已存在", code); DisEnableStatusEnum newStatus = req.getStatus(); StorageDO oldStorage = super.getById(id); CheckUtils.throwIf(Boolean.TRUE.equals(oldStorage.getIsDefault()) && DisEnableStatusEnum.DISABLE .equals(newStatus), "[{}] 是默认存储,不允许禁用", oldStorage.getName()); + decodeSecretKey(req, oldStorage); DisEnableStatusEnum oldStatus = oldStorage.getStatus(); - if (DisEnableStatusEnum.ENABLE.equals(oldStatus) || DisEnableStatusEnum.DISABLE.equals(newStatus)) { + if (DisEnableStatusEnum.ENABLE.equals(oldStatus) && DisEnableStatusEnum.DISABLE.equals(newStatus)) { this.unload(BeanUtil.copyProperties(oldStorage, StorageReq.class)); } if (DisEnableStatusEnum.ENABLE.equals(newStatus)) { @@ -113,6 +96,23 @@ public class StorageServiceImpl extends BaseServiceImpl SecureUtils.decryptByRsaPrivateKey(req.getSecretKey())); + ValidationUtils.throwIfNull(secretKey, "私有密钥解密失败"); + req.setSecretKey(secretKey); + } + @Override protected void beforeDelete(List ids) { CheckUtils.throwIf(fileService.countByStorageIds(ids) > 0, "所选存储存在文件关联,请删除文件后重试"); diff --git a/continew-admin-webapi/src/main/java/top/continew/admin/webapi/system/MenuController.java b/continew-admin-webapi/src/main/java/top/continew/admin/webapi/system/MenuController.java index b3375cba..92c59211 100644 --- a/continew-admin-webapi/src/main/java/top/continew/admin/webapi/system/MenuController.java +++ b/continew-admin-webapi/src/main/java/top/continew/admin/webapi/system/MenuController.java @@ -18,6 +18,7 @@ package top.continew.admin.webapi.system; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PathVariable; @@ -27,6 +28,7 @@ import top.continew.admin.system.model.query.MenuQuery; import top.continew.admin.system.model.req.MenuReq; import top.continew.admin.system.model.resp.MenuResp; import top.continew.admin.system.service.MenuService; +import top.continew.starter.core.constant.StringConstants; import top.continew.starter.core.util.URLUtils; import top.continew.starter.core.util.validate.ValidationUtils; import top.continew.starter.extension.crud.annotation.CrudRequestMapping; @@ -69,6 +71,11 @@ public class MenuController extends BaseController