Kaynağa Gözat

😁1、增加姓名、身份证、电话、邮箱、银行卡脱敏特性 2、统一JSON序列化

zuohuaijun 2 yıl önce
ebeveyn
işleme
e404208401

+ 80 - 0
Admin.NET/Admin.NET.Core/Attribute/MaskNewtonsoftJsonConverter.cs

@@ -0,0 +1,80 @@
+// 麻省理工学院许可证
+//
+// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
+//
+// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
+//
+// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
+// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
+
+using Newtonsoft.Json;
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 字符串掩码
+/// </summary>
+[SuppressSniffer]
+public class MaskNewtonsoftJsonConverter : JsonConverter<string>
+{
+    public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer)
+    {
+        return reader.Value.ToString();
+    }
+
+    public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer)
+    {
+        writer.WriteValue(value?.ToString().Mask());
+    }
+}
+
+/// <summary>
+/// 身份证掩码
+/// </summary>
+[SuppressSniffer]
+public class MaskIdCardNewtonsoftJsonConverter : JsonConverter<string>
+{
+    public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer)
+    {
+        return reader.Value.ToString();
+    }
+
+    public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer)
+    {
+        writer.WriteValue(value?.ToString().MaskIdCard());
+    }
+}
+
+/// <summary>
+/// 邮箱掩码
+/// </summary>
+[SuppressSniffer]
+public class MaskEmailNewtonsoftJsonConverter : JsonConverter<string>
+{
+    public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer)
+    {
+        return reader.Value.ToString();
+    }
+
+    public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer)
+    {
+        writer.WriteValue(value?.ToString().MaskEmail());
+    }
+}
+
+/// <summary>
+/// 银行卡号掩码
+/// </summary>
+[SuppressSniffer]
+public class MaskBankCardNewtonsoftJsonConverter : JsonConverter<string>
+{
+    public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer)
+    {
+        return reader.Value.ToString();
+    }
+
+    public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer)
+    {
+        writer.WriteValue(value?.ToString().MaskBankCard());
+    }
+}

+ 81 - 0
Admin.NET/Admin.NET.Core/Attribute/MaskSystemTextJsonConverter.cs

@@ -0,0 +1,81 @@
+// 麻省理工学院许可证
+//
+// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
+//
+// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
+//
+// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
+// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
+
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 字符串掩码
+/// </summary>
+[SuppressSniffer]
+public class MaskSystemTextJsonConverter : JsonConverter<string>
+{
+    public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+    {
+        return reader.GetString();
+    }
+
+    public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
+    {
+        writer.WriteStringValue(value?.ToString().Mask());
+    }
+}
+
+/// <summary>
+/// 身份证掩码
+/// </summary>
+[SuppressSniffer]
+public class MaskIdCardSystemTextJsonConverter : JsonConverter<string>
+{
+    public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+    {
+        return reader.GetString();
+    }
+
+    public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
+    {
+        writer.WriteStringValue(value?.ToString().MaskIdCard());
+    }
+}
+
+/// <summary>
+/// 邮箱掩码
+/// </summary>
+[SuppressSniffer]
+public class MaskEmailSystemTextJsonConverter : JsonConverter<string>
+{
+    public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+    {
+        return reader.GetString();
+    }
+
+    public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
+    {
+        writer.WriteStringValue(value?.ToString().MaskEmail());
+    }
+}
+
+/// <summary>
+/// 银行卡号掩码
+/// </summary>
+[SuppressSniffer]
+public class MaskBankCardSystemTextJsonConverter : JsonConverter<string>
+{
+    public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+    {
+        return reader.GetString();
+    }
+
+    public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
+    {
+        writer.WriteStringValue(value?.ToString().MaskBankCard());
+    }
+}

+ 1 - 1
Admin.NET/Admin.NET.Core/Entity/SysUser.cs

@@ -28,8 +28,8 @@ public class SysUser : EntityTenant
     /// </summary>
     [SugarColumn(ColumnDescription = "密码", Length = 512)]
     [MaxLength(512)]
+    [Newtonsoft.Json.JsonIgnore]
     [System.Text.Json.Serialization.JsonIgnore]
-    [JsonIgnore]
     public virtual string Password { get; set; }
 
     /// <summary>

+ 66 - 0
Admin.NET/Admin.NET.Core/Extension/ObjectExtension.cs

@@ -265,4 +265,70 @@ public static partial class ObjectExtension
     {
         return obj == null || string.IsNullOrEmpty(obj.ToString());
     }
+
+    /// <summary>
+    /// 字符串掩码
+    /// </summary>
+    /// <param name="str">字符串</param>
+    /// <param name="mask">掩码符</param>
+    /// <returns></returns>
+    public static string Mask(this string str, char mask = '*')
+    {
+        if (string.IsNullOrWhiteSpace(str?.Trim()))
+            return str;
+
+        str = str.Trim();
+        var masks = mask.ToString().PadLeft(4, mask);
+        return str.Length switch
+        {
+            >= 11 => Regex.Replace(str, "(.{3}).*(.{4})", $"$1{masks}$2"),
+            10 => Regex.Replace(str, "(.{3}).*(.{3})", $"$1{masks}$2"),
+            9 => Regex.Replace(str, "(.{2}).*(.{3})", $"$1{masks}$2"),
+            8 => Regex.Replace(str, "(.{2}).*(.{2})", $"$1{masks}$2"),
+            7 => Regex.Replace(str, "(.{1}).*(.{2})", $"$1{masks}$2"),
+            6 => Regex.Replace(str, "(.{1}).*(.{1})", $"$1{masks}$2"),
+            _ => Regex.Replace(str, "(.{1}).*", $"$1{masks}")
+        };
+    }
+
+    /// <summary>
+    /// 身份证号掩码
+    /// </summary>
+    /// <param name="idCard">身份证号</param>
+    /// <param name="mask">掩码符</param>
+    /// <returns></returns>
+    public static string MaskIdCard(this string idCard, char mask = '*')
+    {
+        if (!idCard.TryValidate(ValidationTypes.IDCard).IsValid) return idCard;
+
+        return idCard.Replace("(?<=\\w{3})\\w(?=\\w{4})", $"{mask}");
+    }
+
+    /// <summary>
+    /// 邮箱掩码
+    /// </summary>
+    /// <param name="email">邮箱</param>
+    /// <param name="mask">掩码符</param>
+    /// <returns></returns>
+    public static string MaskEmail(this string email, char mask = '*')
+    {
+        if (!email.TryValidate(ValidationTypes.EmailAddress).IsValid) return email;
+
+        var masks = mask.ToString().PadLeft(4, mask);
+        return email.Replace("(^\\w)[^@]*(@.*$)", $"$1{masks}$2");
+    }
+
+    /// <summary>
+    /// 银行卡号掩码
+    /// </summary>
+    /// <param name="bankCard">银行卡号</param>
+    /// <param name="mask">掩码符</param>
+    /// <returns></returns>
+    public static string MaskBankCard(this string bankCard, char mask = '*')
+    {
+        if (bankCard.Length < 10) return bankCard;
+
+        var masks = mask.ToString().PadLeft(4, mask);
+        return bankCard.Replace("(\\d{6})\\d{9}(\\d{4})", $"$1{masks}$2");
+    }
 }

+ 1 - 1
Admin.NET/Admin.NET.Core/GlobalUsings.cs

@@ -39,7 +39,7 @@ global using Microsoft.Extensions.Logging;
 global using Microsoft.Extensions.Options;
 global using NewLife;
 global using NewLife.Caching;
-global using Newtonsoft.Json;
+//global using Newtonsoft.Json;
 global using SKIT.FlurlHttpClient;
 global using SKIT.FlurlHttpClient.Wechat.Api;
 global using SKIT.FlurlHttpClient.Wechat.Api.Models;

+ 1 - 0
Admin.NET/Admin.NET.Core/Service/DataBase/SysDatabaseService.cs

@@ -7,6 +7,7 @@
 // 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
 // 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
 
+using Newtonsoft.Json;
 using Newtonsoft.Json.Converters;
 
 namespace Admin.NET.Core.Service;

+ 1 - 0
Admin.NET/Admin.NET.Core/SignalR/SignalRSetup.cs

@@ -9,6 +9,7 @@
 
 using Furion.Logging.Extensions;
 using Microsoft.AspNetCore.DataProtection;
+using Newtonsoft.Json;
 using StackExchange.Redis;
 
 namespace Admin.NET.Core;

+ 6 - 3
Admin.NET/Admin.NET.Core/Util/ComputerUtil.cs

@@ -147,13 +147,16 @@ public static class ComputerUtil
 /// </summary>
 public class MemoryMetrics
 {
-    [JsonIgnore]
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     public double Total { get; set; }
 
-    [JsonIgnore]
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     public double Used { get; set; }
 
-    [JsonIgnore]
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     public double Free { get; set; }
 
     /// <summary>

+ 4 - 2
Admin.NET/Admin.NET.Core/Util/JsonSerializerProvider.cs → Admin.NET/Admin.NET.Core/Util/NewtonsoftJsonSerializerProvider.cs

@@ -7,12 +7,14 @@
 // 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
 // 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
 
+using Newtonsoft.Json;
+
 namespace Admin.NET.Core;
 
 /// <summary>
-/// Newtonsoft.Json 实现
+/// 自定义序列化提供器 Newtonsoft.Json 实现
 /// </summary>
-public class JsonSerializerProvider : IJsonSerializerProvider, ISingleton
+public class NewtonsoftJsonSerializerProvider : IJsonSerializerProvider, ISingleton
 {
     /// <summary>
     /// 序列化对象