大部分系統(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)類,如下,。 1 class User
2 { 3 bool CanDelete; 4 bool CanRead; 5 bool CanWrite; 6 bool CanModify; 7 bool CanCreate; 8 } 這里設(shè)計(jì)5個(gè)屬性來(lái)管控用戶的權(quán)限,。我發(fā)現(xiàn)這樣雖然很直觀,但是不宜擴(kuò)張,。我們將權(quán)限獨(dú)立出來(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è)用戶
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 利用了'|'和'&'兩個(gè)操作,。但是這樣看起來(lái)很是很別捏,,初始化權(quán)限和驗(yàn)證權(quán)限用了一長(zhǎng)串'|'和'&'運(yùn)算的代碼。很不直觀,。我在System.Enum中擴(kuò)展一些方法供你調(diào)用,,代碼如下。
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 }
使用一下: 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(); 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
|
|
來(lái)自: 賈朋亮博客 > 《權(quán)限管理》