001/** 002 * Copyright (c) 2022-2023, 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.HashMap; 019import java.util.Map; 020import java.util.function.Supplier; 021 022/** 023 * 数据脱敏工厂类 024 */ 025public class MaskManager { 026 027 028 /** 029 * 脱敏处理器,type : processer 030 */ 031 private static Map<String, MaskProcesser> processerMap = new HashMap<>(); 032 033 034 static { 035 registerMaskProcesser(Masks.MOBILE, Masks.MOBILE_PROCESSER); 036 registerMaskProcesser(Masks.FIXED_PHONE, Masks.FIXED_PHONE_PROCESSER); 037 registerMaskProcesser(Masks.ID_CARD_NUMBER, Masks.ID_CARD_NUMBER_PROCESSER); 038 registerMaskProcesser(Masks.CHINESE_NAME, Masks.CHINESE_NAME_PROCESSER); 039 registerMaskProcesser(Masks.ADDRESS, Masks.ADDRESS_PROCESSER); 040 registerMaskProcesser(Masks.EMAIL, Masks.EMAIL_PROCESSER); 041 registerMaskProcesser(Masks.PASSWORD, Masks.PASSWORD_PROCESSER); 042 registerMaskProcesser(Masks.CAR_LICENSE, Masks.CAR_LICENSE_PROCESSER); 043 registerMaskProcesser(Masks.BANK_CARD_NUMBER, Masks.BANK_CARD_PROCESSER); 044 } 045 046 047 /** 048 * 注册处理器,用户可以注册新的脱敏处理器 或者 覆盖内置的处理器 049 * 050 * @param type 处理器类型 051 * @param processer 脱敏处理器 052 */ 053 public static void registerMaskProcesser(String type, MaskProcesser processer) { 054 processerMap.put(type, processer); 055 } 056 057 058 private static ThreadLocal<Boolean> skipFlags = new ThreadLocal<>(); 059 060 /** 061 * 跳过脱敏处理 062 */ 063 public static <T> T withoutMask(Supplier<T> supplier) { 064 try { 065 skipMask(); 066 return supplier.get(); 067 } finally { 068 restoreMask(); 069 } 070 } 071 072 /** 073 * 跳过脱敏处理 074 */ 075 public static void skipMask() { 076 skipFlags.set(Boolean.TRUE); 077 } 078 079 080 /** 081 * 恢复脱敏处理 082 */ 083 public static void restoreMask() { 084 skipFlags.remove(); 085 } 086 087 088 public static Object mask(String type, Object data) { 089 Boolean skipMask = skipFlags.get(); 090 if (skipMask != null && skipMask) { 091 return data; 092 } 093 094 MaskProcesser maskProcesser = processerMap.get(type); 095 if (maskProcesser == null) { 096 throw new IllegalStateException("Can not get mask processer for by type: " + type); 097 } 098 099 return maskProcesser.mask(data); 100 } 101 102}