系统权限设计

大部分系统都有权限系统。一般来说,它能管控人员对某个否页面的访问;对某些字段、控件可见或者不可见。对gridview中的数据是否可删除、可添加、可新增等等。大部分人都把权限作为一个子系统独立出来。但是这里我不是想设计一个权限管理系统,网上的设计方案太多了,可以说每个开发人员都有自己的开发权限管理系统的想法和思路。
C#:
   好吧,先从最简单开始,定义一个用户(User)类,如下。
1 class User
2 {
3     bool CanDelete;
  bool CanRead;
5     bool CanWrite;
  bool CanModify;
7     bool CanCreate;
8 }
    这里设计5个属性来管控用户的权限。我发现这样虽然很直观,但是不宜扩张。我们将权限独立出来,在看下面代码:
1 enum PermissionTypes : int
2     {
3         None =0,
4         Read =1,
5         Write =2,
6         Modify =4,
7         Delete =8,
8         Create =16,
9         All = Read | Write | Modify | Delete | Create
10     }
11 class User
12     {
13        public PermissionTypes Permissi** = PermissionTypes.None;
14     }



    我们先试用一下,你就能感觉到神奇之处:

1 //创建一个用户

2 User admin =new User();
3 admin.Permissi** = PermissionTypes.Read
4     | PermissionTypes.Write
5     | PermissionTypes.Delete;
6

7 //验证权限

8 bool canRead = ((PermissionTypes.Read & admin.Permissi**) == PermissionTypes.Read);
9 bool canWrite = ((PermissionTypes.Write & admin.Permissi**) == PermissionTypes.Write);
10bool canCreate = ((PermissionTypes.Create & admin.Permissi**) == PermissionTypes.Create);
11
12
//查看结果
13 C**ole.WriteLine(canRead); //true
14 C**ole.WriteLine(canWrite); //true
15 C**ole.WriteLine(canCreate); //false
16 
    利用了'|'和'&'两个操作。但是这样看起来很是很别捏,初始化权限和验证权限用了一长串'|'和'&'运算的代码。很不直观。我在System.Enum中扩展一些方法供你调用,代码如下。

1 //是否存在权限
2 public static bool Has<T>(this System.Enum type, T value)
3         {
4        try
5             {
6                return (((int)(object)type & (int)(object)value) == (int)(object)value);
7             }
8        catch
9             {
10              return false;
11            }
12         }

13 //判断权限

14 public static bool Is<T>(this System.Enum type, T value)
15         {
16       try
17             {
18                return (int)(object)type == (int)(object)value;
19             }
20       catch
21             {
22                return  false;
23             }
24         }
25

//添加权限
26  public  static T Add<T>(this System.Enum type, T value)
27         {
28           try
29             {
30                return (T)(object)(((int)(object)type | (int)(object)value));
31             }
32           catch (Exception ex)
33             {
34               throw new ArgumentException(
35               string.Format(
36               "不能添加类型 '{0}'",
37                typeof(T).Name
38                         ), ex);
39             }
40         }
41
42 //移除权限
43 public static T Remove<T>(this System.Enum type, T value)
44         {
45        try
46             {
47               return (T)(object)(((int)(object)type & ~(int)(object)value));
48             }
49        catch (Exception ex)
50             {
51               throw new ArgumentException(
52                            string.Format(
53                           "不能移除类型 '{0}'",
54                            typeof(T).Name
55                            ), ex);
56             }
57         }



使用一下:

1 //创建一个用户
2            User admin =new User();
3             PermissionTypes permissi** =new PermissionTypes();
4             admin.Permissi** = permissi**;
5 //添加权限
6             admin.Permissi** = admin.Permissi**.Add(PermissionTypes.Create);
7             admin.Permissi** = admin.Permissi**.Add(PermissionTypes.Read);
8             admin.Permissi** = admin.Permissi**.Add(PermissionTypes.Write);
9 //判断权限
10bool canRead = admin.Permissi**.Has(PermissionTypes.Read); //true
11bool canWrite = admin.Permissi**.Has(PermissionTypes.Write); //true
12bool canDelete = admin.Permissi**.Has(PermissionTypes.Delete); //false
13bool canCreate = admin.Permissi**.Has(PermissionTypes.Create); //true
14
15             C**ole.WriteLine(canRead); //true
16             C**ole.WriteLine(canWrite); //true
17             C**ole.WriteLine(canDelete); //false
18             C**ole.WriteLine(canCreate); //true
19             C**ole.Read();
SQL:

    大部分权限管理都是数据库的操作,好依照上面的思路,我在sqlserver里面模拟一下以上的操作,在sql中与或运算是很高效的。先设计两张表User和Permission。





1、获取有Read权限的所有用户:

1 select * from [User] where PermissionTypes&1=1

Result:

2、获取有Delete权限的所有用户:

1 select * from [User] where PermissionTypes&8=8

Result:


3、判断麒麟是否有有Delete权限

1 if exists (select * from [User] where Name='qilin' and  PermissionTypes&8 =8)
2     print 'true'
3  else
4     print 'flase'

    Result: flase
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值