From ffc385f566caf13755ff36f50beddd0221516543 Mon Sep 17 00:00:00 2001
From: 刘帅 <rr.iii@qq.com>
Date: 星期四, 17 九月 2026 15:48:23 +0800
Subject: [PATCH] feat&bug:隐私号放行

---
 cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/AppUserDetailsVo.java |    2 ++
 cloud-server-account/src/main/java/com/dsh/privacy/UnmaskedSensitiveData.java                       |   15 +++++++++++++++
 cloud-server-account/src/main/java/com/dsh/privacy/SensitiveDataMaskingAdvice.java                  |    4 +++-
 3 files changed, 20 insertions(+), 1 deletions(-)

diff --git a/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/AppUserDetailsVo.java b/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/AppUserDetailsVo.java
index 25047d6..50b4f95 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/AppUserDetailsVo.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/AppUserDetailsVo.java
@@ -1,6 +1,7 @@
 package com.dsh.account.model.vo.userBenefitDetail;
 
 
+import com.dsh.privacy.UnmaskedSensitiveData;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -16,6 +17,7 @@
     private String userName;
 
     @ApiModelProperty(value = "用户手机号")
+    @UnmaskedSensitiveData
     private String userPhone;
 
     @ApiModelProperty(value = "用户性别")
diff --git a/cloud-server-account/src/main/java/com/dsh/privacy/SensitiveDataMaskingAdvice.java b/cloud-server-account/src/main/java/com/dsh/privacy/SensitiveDataMaskingAdvice.java
index 1045921..0565e3c 100644
--- a/cloud-server-account/src/main/java/com/dsh/privacy/SensitiveDataMaskingAdvice.java
+++ b/cloud-server-account/src/main/java/com/dsh/privacy/SensitiveDataMaskingAdvice.java
@@ -69,7 +69,9 @@
                     field.setAccessible(true);
                     Object fieldValue = field.get(value);
                     int sensitive = sensitiveType(field.getName());
-                    if (fieldValue instanceof String && sensitive != 0) field.set(value, maskText((String) fieldValue, sensitive));
+                    if (fieldValue instanceof String && sensitive != 0 && !field.isAnnotationPresent(UnmaskedSensitiveData.class)) {
+                        field.set(value, maskText((String) fieldValue, sensitive));
+                    }
                     else mask(fieldValue, visited);
                 } catch (IllegalAccessException ignored) { }
             }
diff --git a/cloud-server-account/src/main/java/com/dsh/privacy/UnmaskedSensitiveData.java b/cloud-server-account/src/main/java/com/dsh/privacy/UnmaskedSensitiveData.java
new file mode 100644
index 0000000..95b6240
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/privacy/UnmaskedSensitiveData.java
@@ -0,0 +1,15 @@
+package com.dsh.privacy;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Allows a single response field to bypass sensitive-data masking.
+ * Use only for endpoints that are authorised to return the original value.
+ */
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface UnmaskedSensitiveData {
+}

--
Gitblit v1.7.1