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}