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

结束:昨天是愚人节,今天不是。欢迎大家拍砖,指正,谢谢!

(全文完)


以下为广告部分

您部署的HTTPS网站安全吗?

如果您想看下您的网站HTTPS部署的是否安全,花1分钟时间来 myssl.com 检测以下吧。让您的HTTPS网站变得更安全!

SSL检测评估

快速了解HTTPS网站安全情况。

安全评级(A+、A、A-...)、行业合规检测、证书信息查看、证书链信息以及补完、服务器套件信息、证书兼容性检测等。

SSL证书工具

安装部署SSL证书变得更方便。

SSL证书内容查看、SSL证书格式转换、CSR在线生成、SSL私钥加解密、CAA检测等。

SSL漏洞检测

让服务器远离SSL证书漏洞侵扰

TLS ROBOT漏洞检测、心血漏洞检测、FREAK Attack漏洞检测、SSL Poodle漏洞检测、CCS注入漏洞检测。

一种简单的直观的高效的权限设计相关推荐

  1. SQL——一种简单的基于角色控制的权限管理数据库设计DEMO

    -- ---------------------------- -- Table structure for resource -- ---------------------------- DROP ...

  2. 艾美捷甘油比色测定试剂盒-简单,敏感,高效

    艾美捷甘油比色测定试剂盒,利用双酶联反应系统来检测血清和血浆中的甘油的含量.最后用酶标仪在540nm处测吸光度值即可. 甘油是甘油三酯的骨架,是参与氧化和合成过程的能量代谢的重要中间体.甘油和游离脂肪 ...

  3. ICCV2021 Oral SimROD:简单高效的数据增强!华为提出了一种简单的鲁棒目标检测自适应方法...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨小马 来源丨我爱计算机视觉 ▊ 写在前面 本文提出了一种简单有效的鲁棒目标检测无监督自适应方法( ...

  4. 选择排序(Selection sort)是一种简单直观的排序算法

    选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大 ...

  5. C++中Future和Promise的一种简单实现

    女主宣言 由于工作需求,笔者最近在阅读 Pulsar C++ 客户端的实现,发现该客户端虽然是基于 C++11 编写的,但却自己编写了 Future 和 Promise 类,随着阅读的深入,也体会到了 ...

  6. 中的listeners_C++中Future和Promise的一种简单实现

    女主宣言 由于工作需求,笔者最近在阅读 Pulsar C++ 客户端的实现,发现该客户端虽然是基于 C++11 编写的,但却自己编写了 Future 和 Promise 类,随着阅读的深入,也体会到了 ...

  7. 五种高效的原型设计工具推荐

    软件产品的诞生注定要经历一个过程:需求分析.设计.开发.测试和在线.在设计阶段,原型设计是软件设计和开发的重要保证.与其他工作一样,高效的原型设计需要相应工具的帮助来完成原型设计.在许多原型设计工具中 ...

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

    XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument. ...

  9. 零基础科普:4种简单推荐算法背后的原理

    导读:大数据平台只是提供了数据获取.存储.计算.应用的技术方案,真正挖掘这些数据之间的关系让数据发挥价值的是各种机器学习算法.在这些算法中,最常见的当属智能推荐算法了.下面通过几种简单的推荐算法来了解 ...

最新文章

  1. 添加绿色版UltraEdit到右键菜单
  2. matlab保存figure图像中所有的点的坐标
  3. 微软亚太区资料科学总监:R 语言是 VS 生态第一顺位
  4. 为什么要使用反射机制
  5. java之sleep、wait、yield、join、notify乱解
  6. (cljs/run-at (JSVM. :browser) 简单类型可不简单啊~)
  7. pcl之将QVTKWidget添加到QtCreator
  8. ATL ActiveX开发入门
  9. 如何选择tomcat版本
  10. android 极简浏览器,盘点最干净简洁的手机浏览器,到底哪个最好用?
  11. 学习笔记(15):C++编程FFMpeg(QT5+OpenCV)实战--实时美颜直播推流-opencv播放rtsp海康摄像头和播放系统摄像头...
  12. 【小程序】小程序安卓,ios,ipad兼容问题
  13. 程序员,你还没有软技能吗?难怪你不幸福
  14. 绿茶和枸杞不可同饮 zt
  15. 重磅!中科院院士,任复旦大学新校长!
  16. OSS: cURL error: Empty reply from server (52)
  17. 特别编辑--windows+python+django实现前端页面上传到指定路径生成个性化二维码
  18. notepad++设置中文刷新后还是英文解决方法
  19. 01033 oracle linux,ORA-01033:ORACLE initialization or shutdown in process
  20. 深度剖析E680G应用五.Telnet与主题

热门文章

  1. 淘宝联盟API使用教程
  2. springboot毕设项目人格障碍诊断系统212h6(java+VUE+Mybatis+Maven+Mysql)
  3. 面向微波毫米波频段协同的共口径天线研究综述
  4. 6轴机器人jacobian矩阵
  5. Python/excel:正态分布直方图
  6. RS-232、RS-422与RS-485标准及应用
  7. 三星堆的青铜机器人_为什么三星堆会发现以古时科技实力根本造不出来的东西?...
  8. 假期旅游防坑必修手册
  9. 电脑报2013年第3期
  10. 基于Arduino高温巡逻报警智能小车