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

简介:

    大部分系统都有权限系统。一般来说,它能管控人员对某个否页面的访问;对某些字段、控件可见或者不可见。对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
19              Console.Read();
复制代码

SQL:

    大部分权限管理都是数据库的操作,好依照上面的思路,我在sqlserver里面模拟一下以上的操作,在sql中与或运算是很高效的。先设计两张表User和Permission。

 

1、获取有Read权限的所有用户:

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

Result:

2、获取有Delete权限的所有用户:

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

Result:

3、判断麒麟是否有有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://www.cnblogs.com/zhuqil/archive/2010/04/02/Permission.html,如需转载请自行联系原作者

相关文章
|
自然语言处理 算法 数据处理
蝶形算法在文档管理系统中的作用:提高文档检索效率
蝶形算法在文档管理系统中的应用主要集中在文本数据的处理和分析方面。以下是一些具体示例——
189 1
|
数据可视化 IDE 安全
云巧-让开发更简单,更高效,更方便
近年来,快速迭代的新需求将引导企业改变其开发方式,进而转向使用支持快速、安全和高效的技术架构,组装式应用便成为了企业重要的战略技术趋势。组装式应用引入模块化的理念,使得各企业可以更敏捷、更有效地复用能力模块,提高商业的韧性和效率。云巧平台应运而生,能极大的改善开发环境,节省开发工作量,让开发更简单,更高效,更方便。
1894 0
|
3天前
|
数据可视化
科研生活从混乱到高效,可视化管理是关键
文章旨在分享科研过程中的实用工具和方法,帮助科研新手更快适应科研生活,减少迷茫和焦虑。
12 0
科研生活从混乱到高效,可视化管理是关键
|
6月前
|
测试技术 开发工具 Android开发
安卓应用开发:打造高效用户界面的关键步骤
【5月更文挑战第27天】本文将探讨在安卓应用开发中如何通过关键步骤打造高效且用户友好的界面。我们将分析UI设计的基本原则,探究Material Design指南,并讨论如何利用Android Studio中的设计工具来优化布局和提高性能。此外,文章还将涉及如何进行有效的测试以确保应用界面既美观又实用。
|
监控 算法 安全
转:文档管理系统中如何利用巴伐利亚算法实现高效使用
巴伐利亚算法(Bavarian Sketching)是一种基于哈希表的数据结构,可以高效地实现近似计数和查询。
80 0
|
6月前
|
算法 程序员 C语言
C++设计哲学:构建高效和灵活代码的艺术
C++设计哲学:构建高效和灵活代码的艺术
126 1
|
6月前
|
数据库 Android开发 开发者
安卓应用开发:构建高效用户界面的策略
【4月更文挑战第24天】 在竞争激烈的移动应用市场中,一个流畅且响应迅速的用户界面(UI)是吸引和保留用户的关键。针对安卓平台,开发者面临着多样化的设备和系统版本,这增加了构建高效UI的复杂性。本文将深入分析安卓平台上构建高效用户界面的最佳实践,包括布局优化、资源管理和绘制性能的考量,旨在为开发者提供实用的技术指南,帮助他们创建更流畅的用户体验。
|
存储 机器学习/深度学习 自然语言处理
转:算法与程序设计在文档管理系统中的优势与场景应用
算法与程序设计在文档管理系统中具有许多优势,这些优势使得系统更高效、安全、智能,并提供更好的用户体验,使得用户可以更方便地管理和利用文档资源。
82 0
项目实战典型案例14——代码结构混乱 逻辑边界不清晰 页面美观设计不足
项目实战典型案例14——代码结构混乱 逻辑边界不清晰 页面美观设计不足
117 0
|
数据可视化
【设计篇】35 # 如何让可视化设计更加清晰?
【设计篇】35 # 如何让可视化设计更加清晰?
75 0
【设计篇】35 # 如何让可视化设计更加清晰?