.NET:可扩展的 “密码强度” 代码示例

场景

在企业应用中,我们经常需要限制用户的密码强度。

问题

如何以可扩展的方式支持不同企业应用的密码强度要求?

思路

    • 算法思路:密码强度 = 求和(每个规则的强度 * 权重)。
    • 可扩展思路:以聚合的形式管理各种规则,让用户可以扩展自定义规则。

.NET:可扩展的 “密码强度” 代码示例_第1张图片

实现

设计类图

.NET:可扩展的 “密码强度” 代码示例_第2张图片

示例代码

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 PasswordStrengthService
10     {
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 PasswordStrengthStudy
10 {
11     class Program
12     {
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 }

输出结果

.NET:可扩展的 “密码强度” 代码示例_第3张图片

备注

我目前还没有在项目中应用过密码强度,如果哪位朋友做过,请留下您的宝贵意见。

 

你可能感兴趣的:(.net)