一种简单的直观的高效的权限设计

  大部分系统都有权限系统。一般来说,它能管控人员对某个否页面的访问;对某些字段、控件可见或者不可见。对gridview中的数据是否可删除、可添加、可新增等等。大部分人都把权限作为一个子系统独立出来。但是这里我不是想设计一个权限管理系统,网上的设计方案太多了,可以说每个开发人员都有自己的开发权限管理系统的想法和思路。

  在这篇文章中,我先用简单的C#代码模仿一个用户的权限,再使用sql去模拟。这是一种很简单,很直观,很高效的方式去判定用户的权限。

C#:

  好吧,先从最简单开始,定义一个用户(User)类,如下。

1 class User 

2 {

3     bool CanDelete;

4     bool CanRead;

5     bool CanWrite;

6     bool CanModify;

7     bool CanCreate;

8 }

   这里设计5个属性来管控用户的权限。我发现这样虽然很直观,但是不宜扩张。我们将权限独立出来,在看下面代码:

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     }

  我们先试用一下,你就能感觉到神奇之处:

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         }

使用一下:

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

时间: 2024-09-21 14:18:13

一种简单的直观的高效的权限设计的相关文章

一起谈.NET技术,一种简单的直观的高效的权限设计

大部分系统都有权限系统.一般来说,它能管控人员对某个否页面的访问:对某些字段.控件可见或者不可见.对gridview中的数据是否可删除.可添加.可新增等等.大部分人都把权限作为一个子系统独立出来.但是这里我不是想设计一个权限管理系统,网上的设计方案太多了,可以说每个开发人员都有自己的开发权限管理系统的想法和思路. 在这篇文章中,我先用简单的C#代码模仿一个用户的权限,再使用sql去模拟.这是一种很简单,很直观,很高效的方式去判定用户的权限. C#: 好吧,先从最简单开始,定义一个用户(User)

asp.net+sqlserver实现的简单高效的权限设计示例_实用技巧

大部分系统都有权限系统.一般来说,它能管控人员对某个否页面的访问:对某些字段.控件可见或者不可见.对gridview中的数据是否可删除.可添加.可新增等等.大部分人都把权限作为一个子系统独立出来.但是这里我不是想设计一个权限管理系统,网上的设计方案太多了,可以说每个开发人员都有自己的开发权限管理系统的想法和思路. 在这篇文章中,我先用简单的C#代码模仿一个用户的权限,再使用sql去模拟.这是一种很简单,很直观,很高效的方式去判定用户的权限. C#: 好吧,先从最简单开始,定义一个用户(User)

php解析xml 的四种简单方法(附实例)_php实例

XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument. 1. XML Expat Parser: XML Parser使用Expat XML解析器.Expat是一种基于事件的解析器,它把XML文档视为一系列事件.当某个事件发生时,它调用一个指定的函数处理它.Expat是无验证的解析器,忽略任何链接到文档的DTD.但是,如果文档的形式不好,则会以一个错误

php解析xml 的四种简单方法(附实例)

XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument. 1. XML Expat Parser: XML Parser使用Expat XML解析器.Expat是一种基于事件的解析器,它把XML文档视为一系列事件.当某个事件发生时,它调用一个指定的函数处理它.Expat是无验证的解析器,忽略任何链接到文档的DTD.但是,如果文档的形式不好,则会以一个错误

调整优化您的LAMP应用程序的5种简单方法

简介 Wikipedia.Facebook 和 Yahoo! 等主要 web 属性使用 LAMP 架构来为每天数百万的请求提供服务,而 Wordpress.Joomla.Drupal 和 SugarCRM 等 web 应用程序软件使用其架构来让组织轻松部署基于 web 的应用程序. 该架构的优势在于其简单性.而 .NET 这样的堆栈和 Java 技术可能使用大量硬件.昂贵的软件栈和复杂的性能调优,LAMP 堆栈可以运行于商品硬件之上,使用开源软件栈.由于软件栈是一个松散的组件集,而非一个整体堆栈

一种简单JDBC连接池的实现(二)

3.简单JDBC连接池的实现 根据第二章中原理机制,Snap-ConnectionPool(一种简单快速的连接池工具)按照部分的JDBC规范,实现了连接池所具备的对数据库资源有效管理功能. 3.1体系描述 在JDBC规范中,应用通过驱动接口(Driver Interface)直接方法数据库的资源.为了有效.合理地管理资源,在应用与JDBC Driver之间,增加了连接池: Snap-ConnectionPool.并且通过面向对象的机制,使连接池的大部分操作是透明的.参见下图,Snap-Conne

LinkedList和List在三种简单算法中效率比较

.Net 框架提供了两种List类型,一种是基于链表的LinkedList, 一种是基于数组的List.那么在实际应用中到底采用哪种List,如何取舍呢?本文对两种类型在队列,堆栈和简单插入三种简单算法中的效率进行了一个比较. 首先先让我们来看一下List的初始容量Capacity对List的性能是否有影响. 测试方法:分别设置初始容量为0,64,255,1024. List插入的最大长度为1000,循环1000次,得到如下结果,单位为ms,下同. 算法/初始容量 0 64 255 1024 队

ps怎么去水印? PS去水印的三种简单方法

  ps怎么去水印?  PS去水印的三种简单方法          方法1:用内容感知移动工具去水印 打开素材图片[ctrl+o],如下图所示. 复制图层[ctrl+j],如下图所示. 单击工具箱中的内容感知移动工具,选中图片中的水印,如下图所示. 往下移,水印不见了,如下图所示. 方法2:用污点修复画笔工具去水印 打开素材图片[ctrl+o],复制图层[ctrl+j],如下图所示.

ASP.Net Post方式获取数据流的一种简单写法

  这篇文章主要介绍了ASP.Net Post方式获取数据流的一种简单写法,本文直接给出代码实例,需要的朋友可以参考下 最近在弄一些第三方的平台,经常调用第三方的接口实现某些特定的功能 在实现的同时基本上都需要本地的数据经过服务器在Request到第三方的服务器中处理,再返回相应的数据结构体:json/xml 以下是我总结的一个小方法,请农友们笑纳: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27