浏览代码

新增数据脱敏帮助类DataMaskHelper
获取用户基本信息脱敏手机号和邮箱数据

zhontai 2 年之前
父节点
当前提交
1dba00aed3

+ 0 - 5
src/platform/ZhonTai.Admin/Services/User/Dto/UserUpdateBasicInput.cs

@@ -8,11 +8,6 @@ namespace ZhonTai.Admin.Services.User.Dto;
 /// </summary>
 public class UserUpdateBasicInput : Entity
 {
-    /// <summary>
-    /// 头像
-    /// </summary>
-    public string Avatar { get; set; }
-
     /// <summary>
     /// 姓名
     /// </summary>

+ 4 - 5
src/platform/ZhonTai.Admin/Services/User/UserService.cs

@@ -36,7 +36,7 @@ namespace ZhonTai.Admin.Services.User;
 /// 用户服务
 /// </summary>
 [DynamicApi(Area = AdminConsts.AreaName)]
-public class UserService : BaseService, IUserService, IDynamicApi
+public partial class UserService : BaseService, IUserService, IDynamicApi
 {
     private AppConfig _appConfig => LazyGetRequiredService<AppConfig>();
     private IUserRepository _userRepository => LazyGetRequiredService<IUserRepository>();
@@ -249,6 +249,8 @@ public class UserService : BaseService, IUserService, IDynamicApi
         }
 
         var data = await _userRepository.GetAsync<UserGetBasicOutput>(User.Id);
+        data.Mobile = DataMaskHelper.PhoneMask(data.Mobile);
+        data.Email = DataMaskHelper.EmailMask(data.Email);
         return data;
     }
 
@@ -475,10 +477,7 @@ public class UserService : BaseService, IUserService, IDynamicApi
 
         // 员工信息
         var staff = await _staffRepository.GetAsync(userId);
-        if(staff == null)
-        {
-            staff = new UserStaffEntity();
-        }
+        staff ??= new UserStaffEntity();
         Mapper.Map(input.Staff, staff);
         staff.Id = userId;
         await _staffRepository.InsertOrUpdateAsync(staff);

+ 0 - 5
src/platform/ZhonTai.Admin/ZhonTai.Admin.xml

@@ -6050,11 +6050,6 @@
             更新基本信息
             </summary>
         </member>
-        <member name="P:ZhonTai.Admin.Services.User.Dto.UserUpdateBasicInput.Avatar">
-            <summary>
-            头像
-            </summary>
-        </member>
         <member name="P:ZhonTai.Admin.Services.User.Dto.UserUpdateBasicInput.Name">
             <summary>
             姓名

+ 45 - 0
src/platform/ZhonTai.Common/Helpers/DataMaskHelper.cs

@@ -0,0 +1,45 @@
+using System.Text.RegularExpressions;
+
+namespace ZhonTai.Common.Helpers;
+
+/// <summary>
+/// 数据脱敏
+/// </summary>
+public partial class DataMaskHelper
+{
+   
+    [GeneratedRegex("(\\d{3})\\d{4}(\\d{4})")]
+    public static partial Regex PhoneMaskRegex();
+
+    [GeneratedRegex("(?<=.{2})[^@]+(?=.{2}@)")]
+    public static partial Regex EmailMaskRegex();
+
+    /// <summary>
+    /// 手机号脱敏
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    public static string PhoneMask(string input)
+    {
+        if (input.IsNull()) { 
+            return input; 
+        }
+
+        return PhoneMaskRegex().Replace(input, "$1****$2");
+    }
+
+    /// <summary>
+    /// 邮箱脱敏
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    public static string EmailMask(string input)
+    {
+        if (input.IsNull())
+        {
+            return input;
+        }
+
+        return EmailMaskRegex().Replace(input, "*****");
+    }
+}

+ 0 - 1
src/platform/ZhonTai.Common/Helpers/IPHelper.cs

@@ -1,6 +1,5 @@
 using Microsoft.AspNetCore.Http;
 using System.Linq;
-using System.Net.NetworkInformation;
 using System.Text.RegularExpressions;
 
 namespace ZhonTai.Common.Helpers;

+ 117 - 0
src/platform/ZhonTai.Common/ZhonTai.Common.xml

@@ -303,6 +303,50 @@
             <param name="str">待打印的字符串</param>
             <param name="color">想要打印的颜色</param>
         </member>
+        <member name="T:ZhonTai.Common.Helpers.DataMaskHelper">
+            <summary>
+            数据脱敏
+            </summary>
+        </member>
+        <member name="M:ZhonTai.Common.Helpers.DataMaskHelper.PhoneMaskRegex">
+            <remarks>
+            Pattern explanation:<br/>
+            <code>
+            ○ 1st capture group.<br/>
+                ○ Match a Unicode digit exactly 3 times.<br/>
+            ○ Match a Unicode digit exactly 4 times.<br/>
+            ○ 2nd capture group.<br/>
+                ○ Match a Unicode digit exactly 4 times.<br/>
+            </code>
+            </remarks>
+        </member>
+        <member name="M:ZhonTai.Common.Helpers.DataMaskHelper.EmailMaskRegex">
+            <remarks>
+            Pattern explanation:<br/>
+            <code>
+            ○ Zero-width positive lookbehind.<br/>
+                ○ Match a character other than '\n' exactly 2 times right-to-left.<br/>
+            ○ Match a character other than '@' greedily at least once.<br/>
+            ○ Zero-width positive lookahead.<br/>
+                ○ Match a character other than '\n' exactly 2 times.<br/>
+                ○ Match '@'.<br/>
+            </code>
+            </remarks>
+        </member>
+        <member name="M:ZhonTai.Common.Helpers.DataMaskHelper.PhoneMask(System.String)">
+            <summary>
+            手机号脱敏
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:ZhonTai.Common.Helpers.DataMaskHelper.EmailMask(System.String)">
+            <summary>
+            邮箱脱敏
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
         <member name="T:ZhonTai.Common.Helpers.DesEncrypt">
             <summary>
             Des加解密
@@ -549,5 +593,78 @@
             <param name="encoding">编码</param>
             <returns></returns>
         </member>
+        <member name="T:System.Text.RegularExpressions.Generated.PhoneMaskRegex_0">
+            <summary>Custom <see cref="T:System.Text.RegularExpressions.Regex"/>-derived type for the PhoneMaskRegex method.</summary>
+        </member>
+        <member name="F:System.Text.RegularExpressions.Generated.PhoneMaskRegex_0.Instance">
+            <summary>Cached, thread-safe singleton instance.</summary>
+        </member>
+        <member name="M:System.Text.RegularExpressions.Generated.PhoneMaskRegex_0.#ctor">
+            <summary>Initializes the instance.</summary>
+        </member>
+        <member name="T:System.Text.RegularExpressions.Generated.PhoneMaskRegex_0.RunnerFactory">
+            <summary>Provides a factory for creating <see cref="T:System.Text.RegularExpressions.RegexRunner"/> instances to be used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
+        </member>
+        <member name="M:System.Text.RegularExpressions.Generated.PhoneMaskRegex_0.RunnerFactory.CreateInstance">
+            <summary>Creates an instance of a <see cref="T:System.Text.RegularExpressions.RegexRunner"/> used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
+        </member>
+        <member name="T:System.Text.RegularExpressions.Generated.PhoneMaskRegex_0.RunnerFactory.Runner">
+            <summary>Provides the runner that contains the custom logic implementing the specified regular expression.</summary>
+        </member>
+        <member name="M:System.Text.RegularExpressions.Generated.PhoneMaskRegex_0.RunnerFactory.Runner.Scan(System.ReadOnlySpan{System.Char})">
+            <summary>Scan the <paramref name="inputSpan"/> starting from base.runtextstart for the next match.</summary>
+            <param name="inputSpan">The text being scanned by the regular expression.</param>
+        </member>
+        <member name="M:System.Text.RegularExpressions.Generated.PhoneMaskRegex_0.RunnerFactory.Runner.TryFindNextPossibleStartingPosition(System.ReadOnlySpan{System.Char})">
+            <summary>Search <paramref name="inputSpan"/> starting from base.runtextpos for the next location a match could possibly start.</summary>
+            <param name="inputSpan">The text being scanned by the regular expression.</param>
+            <returns>true if a possible match was found; false if no more matches are possible.</returns>
+        </member>
+        <member name="M:System.Text.RegularExpressions.Generated.PhoneMaskRegex_0.RunnerFactory.Runner.TryMatchAtCurrentPosition(System.ReadOnlySpan{System.Char})">
+            <summary>Determine whether <paramref name="inputSpan"/> at base.runtextpos is a match for the regular expression.</summary>
+            <param name="inputSpan">The text being scanned by the regular expression.</param>
+            <returns>true if the regular expression matches at the current position; otherwise, false.</returns>
+        </member>
+        <member name="T:System.Text.RegularExpressions.Generated.EmailMaskRegex_1">
+            <summary>Custom <see cref="T:System.Text.RegularExpressions.Regex"/>-derived type for the EmailMaskRegex method.</summary>
+        </member>
+        <member name="F:System.Text.RegularExpressions.Generated.EmailMaskRegex_1.Instance">
+            <summary>Cached, thread-safe singleton instance.</summary>
+        </member>
+        <member name="M:System.Text.RegularExpressions.Generated.EmailMaskRegex_1.#ctor">
+            <summary>Initializes the instance.</summary>
+        </member>
+        <member name="T:System.Text.RegularExpressions.Generated.EmailMaskRegex_1.RunnerFactory">
+            <summary>Provides a factory for creating <see cref="T:System.Text.RegularExpressions.RegexRunner"/> instances to be used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
+        </member>
+        <member name="M:System.Text.RegularExpressions.Generated.EmailMaskRegex_1.RunnerFactory.CreateInstance">
+            <summary>Creates an instance of a <see cref="T:System.Text.RegularExpressions.RegexRunner"/> used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
+        </member>
+        <member name="T:System.Text.RegularExpressions.Generated.EmailMaskRegex_1.RunnerFactory.Runner">
+            <summary>Provides the runner that contains the custom logic implementing the specified regular expression.</summary>
+        </member>
+        <member name="M:System.Text.RegularExpressions.Generated.EmailMaskRegex_1.RunnerFactory.Runner.Scan(System.ReadOnlySpan{System.Char})">
+            <summary>Scan the <paramref name="inputSpan"/> starting from base.runtextstart for the next match.</summary>
+            <param name="inputSpan">The text being scanned by the regular expression.</param>
+        </member>
+        <member name="M:System.Text.RegularExpressions.Generated.EmailMaskRegex_1.RunnerFactory.Runner.TryFindNextPossibleStartingPosition(System.ReadOnlySpan{System.Char})">
+            <summary>Search <paramref name="inputSpan"/> starting from base.runtextpos for the next location a match could possibly start.</summary>
+            <param name="inputSpan">The text being scanned by the regular expression.</param>
+            <returns>true if a possible match was found; false if no more matches are possible.</returns>
+        </member>
+        <member name="M:System.Text.RegularExpressions.Generated.EmailMaskRegex_1.RunnerFactory.Runner.TryMatchAtCurrentPosition(System.ReadOnlySpan{System.Char})">
+            <summary>Determine whether <paramref name="inputSpan"/> at base.runtextpos is a match for the regular expression.</summary>
+            <param name="inputSpan">The text being scanned by the regular expression.</param>
+            <returns>true if the regular expression matches at the current position; otherwise, false.</returns>
+        </member>
+        <member name="T:System.Text.RegularExpressions.Generated.Utilities">
+            <summary>Helper methods used by generated <see cref="T:System.Text.RegularExpressions.Regex"/>-derived implementations.</summary>
+        </member>
+        <member name="F:System.Text.RegularExpressions.Generated.Utilities.s_defaultTimeout">
+            <summary>Default timeout value set in <see cref="T:System.AppContext"/>, or <see cref="F:System.Text.RegularExpressions.Regex.InfiniteMatchTimeout"/> if none was set.</summary>
+        </member>
+        <member name="F:System.Text.RegularExpressions.Generated.Utilities.s_hasTimeout">
+            <summary>Whether <see cref="F:System.Text.RegularExpressions.Generated.Utilities.s_defaultTimeout"/> is non-infinite.</summary>
+        </member>
     </members>
 </doc>