From 7c533a21d2da2c9c106e1a477bdb68532715e7e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E4=B8=80=E6=A3=AE?= Date: Thu, 9 Nov 2023 16:03:53 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E8=84=B1?= =?UTF-8?q?=E6=95=8F=E5=A2=9E=E5=8A=A0=E8=A7=92=E8=89=B2=E5=8F=8A=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/constant/UserConstants.java | 5 +++++ .../sensitive/annotation/Sensitive.java | 5 +++++ .../sensitive/core/SensitiveService.java | 2 +- .../sensitive/handler/SensitiveHandler.java | 6 +++++- .../controller/TestSensitiveController.java | 4 ++-- .../service/impl/SysSensitiveServiceImpl.java | 19 ++++++++++++++++++- 6 files changed, 36 insertions(+), 5 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/UserConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/UserConstants.java index 6f3b0b96b..951b8371d 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/UserConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/UserConstants.java @@ -139,4 +139,9 @@ public interface UserConstants { */ Long SUPER_ADMIN_ID = 1L; + /** + * 角色及菜单权限脱敏标识 + */ + String SENSITIVE = "sensitive"; + } diff --git a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java index f2def8ab2..2648a52eb 100644 --- a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java +++ b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/annotation/Sensitive.java @@ -2,6 +2,7 @@ package org.dromara.common.sensitive.annotation; import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.dromara.common.core.constant.UserConstants; import org.dromara.common.sensitive.core.SensitiveStrategy; import org.dromara.common.sensitive.handler.SensitiveHandler; @@ -21,4 +22,8 @@ import java.lang.annotation.Target; @JsonSerialize(using = SensitiveHandler.class) public @interface Sensitive { SensitiveStrategy strategy(); + + String roleKey() default UserConstants.SENSITIVE; + + String perms() default UserConstants.SENSITIVE; } diff --git a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveService.java b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveService.java index 4b57fcb82..9571745c7 100644 --- a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveService.java +++ b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveService.java @@ -13,6 +13,6 @@ public interface SensitiveService { /** * 是否脱敏 */ - boolean isSensitive(); + boolean isSensitive(String roleKey,String perms); } diff --git a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java index 3c8b78a31..c76c83a98 100644 --- a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java +++ b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java @@ -26,12 +26,14 @@ import java.util.Objects; public class SensitiveHandler extends JsonSerializer implements ContextualSerializer { private SensitiveStrategy strategy; + private String roleKey; + private String perms; @Override public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { try { SensitiveService sensitiveService = SpringUtils.getBean(SensitiveService.class); - if (ObjectUtil.isNotNull(sensitiveService) && sensitiveService.isSensitive()) { + if (ObjectUtil.isNotNull(sensitiveService) && sensitiveService.isSensitive(roleKey, perms)) { gen.writeString(strategy.desensitizer().apply(value)); } else { gen.writeString(value); @@ -47,6 +49,8 @@ public class SensitiveHandler extends JsonSerializer implements Contextu Sensitive annotation = property.getAnnotation(Sensitive.class); if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) { this.strategy = annotation.strategy(); + this.roleKey = annotation.roleKey(); + this.perms = annotation.perms(); return this; } return prov.findValueSerializer(property.getType(), property); diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java index 8d6ad5397..f4e9f19c9 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java @@ -50,13 +50,13 @@ public class TestSensitiveController extends BaseController { /** * 电话 */ - @Sensitive(strategy = SensitiveStrategy.PHONE) + @Sensitive(strategy = SensitiveStrategy.PHONE, roleKey = "common") private String phone; /** * 地址 */ - @Sensitive(strategy = SensitiveStrategy.ADDRESS) + @Sensitive(strategy = SensitiveStrategy.ADDRESS, perms = "system:user:query") private String address; /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java index 1202c33f2..38b5454cf 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java @@ -1,5 +1,8 @@ package org.dromara.system.service.impl; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.sensitive.core.SensitiveService; import org.dromara.common.tenant.helper.TenantHelper; @@ -20,7 +23,21 @@ public class SysSensitiveServiceImpl implements SensitiveService { * 是否脱敏 */ @Override - public boolean isSensitive() { + public boolean isSensitive(String roleKey,String perms) { + if (!StpUtil.isLogin()){ + return true; + } + LoginUser loginUser = LoginHelper.getLoginUser(); + if (ObjectUtil.isNotNull(loginUser)) { + boolean roleSensitiveFlag = loginUser.getRolePermission().stream().anyMatch(role -> role.contains(roleKey)); + if (roleSensitiveFlag) { + return false; + } + boolean permsSensitiveFlag = loginUser.getMenuPermission().stream().anyMatch(menu -> menu.contains(perms)); + if (permsSensitiveFlag) { + return false; + } + } if (TenantHelper.isEnable()) { return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin(); }