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