001/* 002 * Copyright (c) 2022-2025, Mybatis-Flex (fuhai999@gmail.com). 003 * <p> 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * <p> 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * <p> 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package com.mybatisflex.core.mask; 017 018import java.util.Collections; 019import java.util.HashMap; 020import java.util.Map; 021import java.util.function.Supplier; 022 023/** 024 * 数据脱敏工厂类 025 */ 026public class MaskManager { 027 028 private MaskManager() { 029 } 030 031 /** 032 * 脱敏处理器,type : processor 033 */ 034 private static final Map<String, MaskProcessor> processorMap = new HashMap<>(); 035 036 private static final ThreadLocal<Boolean> skipFlags = new ThreadLocal<>(); 037 038 039 static { 040 registerMaskProcessor(Masks.MOBILE, Masks.MOBILE_PROCESSOR); 041 registerMaskProcessor(Masks.FIXED_PHONE, Masks.FIXED_PHONE_PROCESSOR); 042 registerMaskProcessor(Masks.ID_CARD_NUMBER, Masks.ID_CARD_NUMBER_PROCESSOR); 043 registerMaskProcessor(Masks.CHINESE_NAME, Masks.CHINESE_NAME_PROCESSOR); 044 registerMaskProcessor(Masks.ADDRESS, Masks.ADDRESS_PROCESSOR); 045 registerMaskProcessor(Masks.EMAIL, Masks.EMAIL_PROCESSOR); 046 registerMaskProcessor(Masks.PASSWORD, Masks.PASSWORD_PROCESSOR); 047 registerMaskProcessor(Masks.CAR_LICENSE, Masks.CAR_LICENSE_PROCESSOR); 048 registerMaskProcessor(Masks.BANK_CARD_NUMBER, Masks.BANK_CARD_PROCESSOR); 049 } 050 051 052 /** 053 * 注册处理器,用户可以注册新的脱敏处理器 或者 覆盖内置的处理器 054 * 055 * @param type 处理器类型 056 * @param processor 脱敏处理器 057 */ 058 public static void registerMaskProcessor(String type, MaskProcessor processor) { 059 processorMap.put(type, processor); 060 } 061 062 public static Map<String, MaskProcessor> getProcessorMap() { 063 return Collections.unmodifiableMap(processorMap); 064 } 065 066 /** 067 * 跳过脱敏处理 068 */ 069 public static <T> T execWithoutMask(Supplier<T> supplier) { 070 try { 071 skipMask(); 072 return supplier.get(); 073 } finally { 074 restoreMask(); 075 } 076 } 077 078 /** 079 * 跳过脱敏处理 080 */ 081 public static void execWithoutMask(Runnable runnable) { 082 try { 083 skipMask(); 084 runnable.run(); 085 } finally { 086 restoreMask(); 087 } 088 } 089 090 /** 091 * 跳过脱敏处理 092 */ 093 public static void skipMask() { 094 skipFlags.set(Boolean.TRUE); 095 } 096 097 098 /** 099 * 恢复脱敏处理 100 */ 101 public static void restoreMask() { 102 skipFlags.remove(); 103 } 104 105 106 public static Object mask(String type, Object data) { 107 Boolean skipMask = skipFlags.get(); 108 if (skipMask != null && skipMask) { 109 return data; 110 } 111 112 MaskProcessor maskProcessor = processorMap.get(type); 113 if (maskProcessor == null) { 114 throw new IllegalStateException("Can not get mask processor for by type: " + type); 115 } 116 117 return maskProcessor.mask(data); 118 } 119 120}