Browse Source

脱敏

master
lichao 2 years ago
parent
commit
357fdd3a27
  1. 13
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/MaskResponse.java
  2. 118
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/processor/MaskProcessor.java
  3. 1
      epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java

13
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/MaskResponse.java

@ -19,6 +19,15 @@ public @interface MaskResponse {
String MASK_TYPE_YANTAI_PEOPLE_NAME = "YANTAI_PEOPLE_NAME";
String MASK_TYPE_YANTAI_ID_CARD = "YANTAI_ID_CARD";
String MASK_TYPE_YANTAI_WORK_ADDRESS = "YANTAI_WORK_ADDRESS";
String MASK_TYPE_YANTAI_RESI_ADDRESS = "YANTAI_RESI_ADDRESS";
String MASK_TYPE_YANTAI_MOBILE = "YANTAI_MOBILE";
String MASK_TYPE_YANTAI_HOUSE = "YANTAI_HOUSE";
///**
// * 默认的一些字段,如果没有手动指定,就会使用默认的。如果手动指定了,就不再使用默认的
// */
@ -33,11 +42,11 @@ public @interface MaskResponse {
* 要打码的字段列表会递归的着这些字段
* @return
*/
String[] fieldNames() default {"idCard","mobile","phone","yantaiPeopleName"};
String[] fieldNames() default {"idCard","mobile","phone","yantaiPeopleName","yantaiWorkAddress","yantaiResiAddress","yantaiMobile","yantaiHouse"};
/**
* 要打码的类型
* @return
*/
String[] fieldsMaskType() default { MASK_TYPE_ID_CARD, MASK_TYPE_MOBILE, MASK_TYPE_MOBILE , MASK_TYPE_YANTAI_PEOPLE_NAME};
String[] fieldsMaskType() default { MASK_TYPE_ID_CARD, MASK_TYPE_MOBILE, MASK_TYPE_MOBILE , MASK_TYPE_YANTAI_PEOPLE_NAME,MASK_TYPE_YANTAI_ID_CARD,MASK_TYPE_YANTAI_WORK_ADDRESS,MASK_TYPE_YANTAI_RESI_ADDRESS,MASK_TYPE_YANTAI_MOBILE,MASK_TYPE_YANTAI_HOUSE};
}

118
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/processor/MaskProcessor.java

@ -142,6 +142,21 @@ public class MaskProcessor {
}else if (MaskResponse.MASK_TYPE_YANTAI_PEOPLE_NAME.equals(maskType)) {
return maskYantaiPeopleName(originString);
}
else if (MaskResponse.MASK_TYPE_YANTAI_ID_CARD.equals(maskType)) {
return maskYantaiIdCard(originString);
}
else if (MaskResponse.MASK_TYPE_YANTAI_WORK_ADDRESS.equals(maskType)) {
return maskYantaiWorkAddress(originString);
}
else if (MaskResponse.MASK_TYPE_YANTAI_RESI_ADDRESS.equals(maskType)) {
return maskYantaiWorkAddress(originString);
}
else if (MaskResponse.MASK_TYPE_YANTAI_HOUSE.equals(maskType)) {
return maskYantaiWorkAddress(originString);
}
else if (MaskResponse.MASK_TYPE_YANTAI_MOBILE.equals(maskType)) {
return maskYantaiMobile(originString);
}
else {
return originString;
}
@ -256,6 +271,68 @@ public class MaskProcessor {
return originString;
}
/**
* 唯一整件号打码可能是身份证号或者是护照号
* 将明文字符串打码变为掩码保留前1后1后面打码
* @param originString
* @return
*/
private String maskYantaiIdCard(String originString) {
// 检查字符串长度
if (originString.length() < 3) {
return originString;
} else {
char firstChar = originString.charAt(0); // 获取第一个字符
char lastChar = originString.charAt(originString.length() - 1); // 获取最后一个字符
StringBuilder maskedString = new StringBuilder();
maskedString.append(firstChar); // 保留第一个字符
// 使用 * 替换中间的字符
for (int i = 1; i < originString.length() - 1; i++) {
maskedString.append('*');
}
maskedString.append(lastChar); // 保留最后一个字符
return maskedString.toString();
}
}
/**
* @Description: 工作地址
* @param originString:
* @Return java.lang.String
* @Author: lichao
* @Date: 2023/10/26 15:47
*/
private String maskYantaiWorkAddress(String originString) {
if (originString.length() > 12) {
// 如果长度大于12,只显示前6位正常,后6位使用*代替
int length = originString.length();
StringBuilder maskedString = new StringBuilder();
maskedString.append(originString, 0, 6); // 显示前6位正常
for (int i = 6; i < length; i++) {
maskedString.append('*'); // 后续使用*代替
}
return maskedString.toString();
} else {
// 如果长度小于等于12,显示前一半字符,后一半用*代替
int length = originString.length();
int halfLength = length / 2;
StringBuilder maskedString = new StringBuilder();
maskedString.append(originString, 0, halfLength); // 显示前一半正常
for (int i = halfLength; i < length; i++) {
maskedString.append('*'); // 后一半使用*代替
}
return maskedString.toString();
}
}
/**
* 将明文字符串打码变为掩码保留前3后4中间打码
* 187****3461
@ -275,6 +352,46 @@ public class MaskProcessor {
return originString.replaceAll("^(1\\d{2})\\d*(\\d{4})$", new StringBuilder("$1").append(maskStr).append("$2").toString());
}
private String maskYantaiMobile(String originString) {
int length = originString.length();
if (length < 7) {
return originString;
}
if (originString.matches("^\\d{11}$")) {
// 如果是11位手机号,显示前3位和后2位,其余*显示
StringBuilder maskedString = new StringBuilder();
maskedString.append(originString, 0, 3); // 前3位正常显示
maskedString.append("****"); // 中间4位用*代替
maskedString.append(originString, 7, 9); // 后2位正常显示
return maskedString.toString();
} else if (originString.contains("-")) {
// 如果包含"-",处理带"-"的情况
StringBuilder maskedString = new StringBuilder();
String[] parts = originString.split("-", 2); // 限制分割为两部分
// 处理包含"-"的情况
String firstPart = parts[0];
String lastPart = parts[1];
maskedString.append(firstPart); // "-前面的正常字符"
maskedString.append("-"); // 保留"-"
maskedString.append("*******"); // "-后面的除了最后一位都显示"*"
maskedString.append(lastPart.charAt(lastPart.length() - 1)); // 最后一位正常显示
return maskedString.toString();
} else if (originString.matches("^\\d{7,8}$")) {
// 如果是7位或8位的,显示前1位和后1位,其余*显示
StringBuilder maskedString = new StringBuilder();
maskedString.append(originString, 0, 1); // 前1位正常显示
maskedString.append("******"); // 中间的用*代替
maskedString.append(originString, originString.length() - 1, originString.length()); // 后1位正常显示
return maskedString.toString();
}
return originString;
}
public static void main(String[] args) {
String[] idc = {"idCard"};
String[] idct = {MaskResponse.MASK_TYPE_ID_CARD};
@ -282,5 +399,6 @@ public class MaskProcessor {
System.out.println(r);
String s = MaskProcessor.maskIdCard("372284152412022222");
System.out.println(s);
}
}

1
epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java

@ -1135,6 +1135,7 @@ public class IcResiUserController implements ResultDataResolver {
* @return
*/
@PostMapping("search")
@MaskResponse(fieldNames = {"ID_CARD","MOBILE","HOME_ID"}, fieldsMaskType = {MaskResponse.MASK_TYPE_YANTAI_ID_CARD,MaskResponse.MASK_TYPE_YANTAI_MOBILE,MaskResponse.MASK_TYPE_YANTAI_HOUSE})
public Result<PageData<Map<String, Object>>> searchResi(@RequestBody IcResiUserPageFormDTO input, @LoginUser TokenDto loginUser) {
if (StringUtils.isBlank(input.getKeyword())) {
PageData<Map<String, Object>> r = new PageData<Map<String, Object>>(new ArrayList<>(), NumConstant.ZERO_L);

Loading…
Cancel
Save