大部分系統都有權限系統。一般來(lái)說(shuō),它能管控人員對某個(gè)否頁(yè)面的訪(fǎng)問(wèn);對某些字段、控件可見(jiàn)或者不可見(jiàn)。對gridview中的數據是否可刪除、可添加、可新增等等。大部分人都把權限作為一個(gè)子系統獨立出來(lái)。但是這里我不是想設計一個(gè)權限管理系統,網(wǎng)上的設計方案太多了,可以說(shuō)每個(gè)開(kāi)發(fā)人員都有自己的開(kāi)發(fā)權限管理系統的想法和思路。
在這篇文章中,我先用簡(jiǎn)單的C#代碼模仿一個(gè)用戶(hù)的權限,再使用sql去模擬。這是一種很簡(jiǎn)單,很直觀(guān),很高效的方式去判定用戶(hù)的權限。
C#:
好吧,先從最簡(jiǎn)單開(kāi)始,定義一個(gè)用戶(hù)(User)類(lèi),如下。
1 class User
2 {
3 bool CanDelete;
4 bool CanRead;
5 bool CanWrite;
6 bool CanModify;
7 bool CanCreate;
8 }
這里設計5個(gè)屬性來(lái)管控用戶(hù)的權限。我發(fā)現這樣雖然很直觀(guān),但是不宜擴張。我們將權限獨立出來(lái),在看下面代碼:
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 Permissions = PermissionTypes.None;
14 }
我們先試用一下,你就能感覺(jué)到神奇之處:
1 //創(chuàng )建一個(gè)用戶(hù)
2 User admin = new User();
3 admin.Permissions = PermissionTypes.Read
4 | PermissionTypes.Write
5 | PermissionTypes.Delete;
6
7 //驗證權限
8 bool canRead = ((PermissionTypes.Read & admin.Permissions) == PermissionTypes.Read);
9 bool canWrite = ((PermissionTypes.Write & admin.Permissions) == PermissionTypes.Write);
10 bool canCreate = ((PermissionTypes.Create & admin.Permissions) == PermissionTypes.Create);
11
12 //查看結果
13 Console.WriteLine(canRead); //true
14 Console.WriteLine(canWrite); //true
15 Console.WriteLine(canCreate); //false
16
利用了'|'和'&'兩個(gè)操作。但是這樣看起來(lái)很是很別捏,初始化權限和驗證權限用了一長(cháng)串'|'和'&'運算的代碼。很不直觀(guān)。我在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 "不能添加類(lèi)型 '{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 "不能移除類(lèi)型 '{0}'",
54 typeof(T).Name
55 ), ex);
56 }
57 }
使用一下:
1 //創(chuàng )建一個(gè)用戶(hù)
2 User admin = new User();
3 PermissionTypes permissions = new PermissionTypes();
4 admin.Permissions = permissions;
5 //添加權限
6 admin.Permissions = admin.Permissions.Add(PermissionTypes.Create);
7 admin.Permissions = admin.Permissions.Add(PermissionTypes.Read);
8 admin.Permissions = admin.Permissions.Add(PermissionTypes.Write);
9 //判斷權限
10 bool canRead = admin.Permissions.Has(PermissionTypes.Read); //true
11 bool canWrite = admin.Permissions.Has(PermissionTypes.Write); //true
12 bool canDelete = admin.Permissions.Has(PermissionTypes.Delete); //false
13 bool canCreate = admin.Permissions.Has(PermissionTypes.Create); //true
14
15 Console.WriteLine(canRead); //true
16 Console.WriteLine(canWrite); //true
17 Console.WriteLine(canDelete); //false
18 Console.WriteLine(canCreate); //true
19 Console.Read();
SQL:
大部分權限管理都是數據庫的操作,好依照上面的思路,我在sqlserver里面模擬一下以上的操作,在sql中與或運算是很高效的。先設計兩張表User和Permission。
1、獲取有Read權限的所有用戶(hù):
1 select * from [User] where PermissionTypes&1 =1
Result:
2、獲取有Delete權限的所有用戶(hù):
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