大部分系统都有权限系统。一般来说,它能管控人员对某个否页面的访问;对某些字段、控件可见或者不可见。对gridview中的数据是否可删除、可添加、可新增等等。大部分人都把权限作为一个子系统独立出来。但是这里我不是想设计一个权限管理系统,网上的设计方案太多了,可以说每个开发人员都有自己的开发权限管理系统的想法和思路。
C#:
好吧,先从最简单开始,定义一个用户(User)类,如下。
1 class User
2 {
3 bool
CanDelete;
4
bool CanRead;
5 bool
CanWrite;
6
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
C#:
1 class User
2 {
3
4
5
6
7
8 }
1 enum PermissionTypes : int
2
3
4
5
6
7
8
9
10
11 class User
12
13
14
1 //创建一个用户
2 User admin =new User();
3 admin.Permissi** = PermissionTypes.Read
4
5
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
1 //是否存在权限
2 public static bool Has<T>(this System.Enum type, T value)
3
4
5
6
7
8
9
10
11
12
13 //判断权限
14 public static bool Is<T>(this System.Enum type, T value)
15
16
17
18
19
20
21
22
23
24
25
//添加权限
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 //移除权限
43 public static T Remove<T>(this System.Enum type, T value)
44
45
46
47
48
49
50
51
52
53
54
55
56
57
使用一下:
1 //创建一个用户
2
3
4
5 //添加权限
6
7
8
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
16
17
18
19
SQL:


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
2
3
4