文章目錄
情境
在公司專屬應用程式中,我們經常需要限制使用者的密碼強度。
問題
如何以可擴充的方式支援不同公司專屬應用程式的密碼強度要求?
思路
-
- 演算法思路:密碼強度 = 求和(每個規則的強度 * 權重)。
- 可擴充思路:以彙總的形式管理各種規則,讓使用者可以擴充自訂規則。
實現設計類圖
範例程式碼
PasswordStrengthService
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace PasswordStrengthStudy.Lib 8 { 9 public sealed class PasswordStrengthService10 {11 private readonly List<IPasswordStrengthRule> _rules = new List<IPasswordStrengthRule>();12 13 public PasswordStrengthService AddRule(IPasswordStrengthRule rule)14 {15 _rules.Add(rule);16 17 return this;18 }19 20 public int GetStreng(string password)21 {22 if (_rules.Count == 0)23 {24 return 0;25 }26 27 return _rules.Sum(rule => rule.GetStreng(password) * rule.Weight / 100);28 }29 }30 }
Program
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 using PasswordStrengthStudy.Lib; 8 9 namespace PasswordStrengthStudy10 {11 class Program12 {13 static void Main(string[] args)14 {15 var service = new PasswordStrengthService();16 17 service.AddRule(new LengthPasswordStrengthRule(40));18 service.AddRule(new RegexPasswordStrengthRule(20, @".*[A-Z].*[A-Z].*"));19 service.AddRule(new RegexPasswordStrengthRule(20, @".*[a-z].*[a-z].*"));20 service.AddRule(new RegexPasswordStrengthRule(20, @".*\d.*\d.*"));21 22 Console.WriteLine(service.GetStreng("12345"));23 Console.WriteLine(service.GetStreng("woshishui"));24 Console.WriteLine(service.GetStreng("woshishuiGG"));25 Console.WriteLine(service.GetStreng("woshishuiGG2012"));26 }27 }28 }
輸出結果
備忘
我目前還沒有在項目中應用過密碼強度,如果哪位朋友做過,請留下您的寶貴意見。