久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

一種簡(jiǎn)單的直觀的高效的權(quán)限設(shè)計(jì)

 賈朋亮博客 2013-07-17
 大部分系統(tǒng)都有權(quán)限系統(tǒng),。一般來(lái)說(shuō),,它能管控人員對(duì)某個(gè)否頁(yè)面的訪問(wèn),;對(duì)某些字段、控件可見(jiàn)或者不可見(jiàn),。對(duì)gridview中的數(shù)據(jù)是否可刪除,、可添加、可新增等等,。大部分人都把權(quán)限作為一個(gè)子系統(tǒng)獨(dú)立出來(lái)。但是這里我不是想設(shè)計(jì)一個(gè)權(quán)限管理系統(tǒng),,網(wǎng)上的設(shè)計(jì)方案太多了,,可以說(shuō)每個(gè)開(kāi)發(fā)人員都有自己的開(kāi)發(fā)權(quán)限管理系統(tǒng)的想法和思路。

   在這篇文章中,,我先用簡(jiǎn)單的C#代碼模仿一個(gè)用戶的權(quán)限,,再使用sql去模擬。這是一種很簡(jiǎn)單,,很直觀,,很高效的方式去判定用戶的權(quán)限。

C#:

   好吧,,先從最簡(jiǎn)單開(kāi)始,,定義一個(gè)用戶(User)類,如下,。

復(fù)制代碼
1 class User 
2 {
3     bool CanDelete;
4     bool CanRead;
5     bool CanWrite;
6     bool CanModify;
7     bool CanCreate;
8 }
復(fù)制代碼

    這里設(shè)計(jì)5個(gè)屬性來(lái)管控用戶的權(quán)限,。我發(fā)現(xiàn)這樣雖然很直觀,但是不宜擴(kuò)張,。我們將權(quán)限獨(dú)立出來(lái),,在看下面代碼:

復(fù)制代碼
 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     }
復(fù)制代碼

    我們先試用一下,你就能感覺(jué)到神奇之處:

復(fù)制代碼
 1 //創(chuàng)建一個(gè)用戶
 2 User admin = new User();
 3 admin.Permissions = PermissionTypes.Read
 4     | PermissionTypes.Write
 5     | PermissionTypes.Delete;
 6 
 7 //驗(yàn)證權(quán)限
 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 //查看結(jié)果
13 Console.WriteLine(canRead); //true
14 Console.WriteLine(canWrite); //true
15 Console.WriteLine(canCreate); //false
16 
復(fù)制代碼

    利用了'|'和'&'兩個(gè)操作,。但是這樣看起來(lái)很是很別捏,,初始化權(quán)限和驗(yàn)證權(quán)限用了一長(zhǎng)串'|'和'&'運(yùn)算的代碼。很不直觀,。我在System.Enum中擴(kuò)展一些方法供你調(diào)用,,代碼如下。

 

復(fù)制代碼
 1   //是否存在權(quán)限
 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         //判斷權(quán)限
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         //添加權(quán)限
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         //移除權(quán)限
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         }
復(fù)制代碼

 

使用一下:

復(fù)制代碼
 1            //創(chuàng)建一個(gè)用戶
 2             User admin = new User();
 3             PermissionTypes permissions = new PermissionTypes();
 4             admin.Permissions = permissions;
 5             //添加權(quán)限
 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            //判斷權(quán)限
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();
復(fù)制代碼

SQL:

    大部分權(quán)限管理都是數(shù)據(jù)庫(kù)的操作,,好依照上面的思路,,我在sqlserver里面模擬一下以上的操作,在sql中與或運(yùn)算是很高效的,。先設(shè)計(jì)兩張表User和Permission。

 

1,、獲取有Read權(quán)限的所有用戶:

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

Result:

2,、獲取有Delete權(quán)限的所有用戶:

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

Result:

3、判斷麒麟是否有有Delete權(quán)限

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

Result: flase

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多