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 = "用户性别") 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) { } } cloud-server-account/src/main/java/com/dsh/privacy/UnmaskedSensitiveData.java
New file @@ -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 { }