一種簡單的直觀的高效的權限設計

大部分系統都有權限系統。通常來講,它能管控人員對某個否頁面的訪問;對某些字段、控件可見或者不可見。對gridview中的數據是否可刪除、可添加、可新增等等。大部分人都把權限做爲一個子系統獨立出來。可是這裏我不是想設計一個權限管理系統,網上的設計方案太多了,能夠說每一個開發人員都有本身的開發權限管理系統的想法和思路。sql

   在這篇文章中,我先用簡單的C#代碼模仿一個用戶的權限,再使用sql去模擬。這是一種很簡單,很直觀,很高效的方式去斷定用戶的權限。數據庫

C#:sqlserver

   好吧,先從最簡單開始,定義一個用戶(User)類,以下。post

複製代碼
1  class  User 
2  {
3       bool  CanDelete;
4       bool  CanRead;
5       bool  CanWrite;
6       bool  CanModify;
7       bool  CanCreate;
8  }
複製代碼

    這裏設計5個屬性來管控用戶的權限。我發現這樣雖然很直觀,可是不宜擴張。咱們將權限獨立出來,在看下面代碼:this

複製代碼
 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      }
複製代碼

    咱們先試用一下,你就能感受到神奇之處:spa

複製代碼
 1  // 建立一個用戶
 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中擴展一些方法供你調用,代碼以下。設計

 

複製代碼
 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          }
複製代碼

 

使用一下:code

複製代碼
 1              // 建立一個用戶
 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:orm

    大部分權限管理都是數據庫的操做,好依照上面的思路,我在sqlserver裏面模擬一下以上的操做,在sql中與或運算是很高效的。先設計兩張表User和Permission。server

 

一、獲取有Read權限的全部用戶:

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

Result:

二、獲取有Delete權限的全部用戶:

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

Result:

三、判斷麒麟是否有有Delete權限

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

Result: flase

 

結束:昨天是愚人節,今天不是。歡迎你們拍磚,指正,謝謝!

做者:朱祁林
出處:http://zhuqil.cnblogs.com 本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。

相關文章
相關標籤/搜索