?大部分系統都有權限系統。一般來說,它能管控人員對某個否頁面的訪問;對某些字段、控件可見或者不可見。對gridview中的數據是否可刪除、可添加、可新增等等。大部分人都把權限作為一個子系統獨立出來。但是這里我不是想設計一個權限管理系統,網上的設計方案太多了,可以說每個開發人員都有自己的開發權限管理系統的想法和思路。
?? 在這篇文章中,我先用簡單的C#代碼模仿一個用戶的權限,再使用sql去模擬。這是一種很簡單,很直觀,很高效的方式去判定用戶的權限。
C#:
???好吧,先從最簡單開始,定義一個用戶(User)類,如下。
2 ? {
3 ? ???? bool ?CanDelete;
4 ? ???? bool ?CanRead;
5 ? ???? bool ?CanWrite;
6 ? ???? bool ?CanModify;
7 ? ???? bool ?CanCreate;
8 ? }
??? 這里設計5個屬性來管控用戶的權限。我發現這樣雖然很直觀,但是不宜擴張。我們將權限獨立出來,在看下面代碼:
?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 ? ????}
??? 我們先試用一下,你就能感覺到神奇之處:
?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 ?
??? 利用了' |' 和' & '兩個操作。但是這樣看起來很是很別捏,初始化權限和驗證權限用了一長串'|'和'&'運算的代碼。很不直觀。我在System.Enum中擴展一些方法供你調用,代碼如下。
?
?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 ? ????????}
?
使用一下:
?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權限的所有用戶:
Result:
2、獲取有Delete權限的所有用戶:
Result:
3、判斷麒麟是否有有Delete權限
2 ???? print ? ' true '
3 ? else
4 ???? print ? ' flase '
Result: flase
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
