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


    大部分系统都有权限系统。一般来说,它能管控人员对某个否页面的访问;对某些字段、控件可见或者不可见。对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://zhuqil.cnblogs.com 
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    JavaScrip--JS面向对象
    JavaScrip-Screen对象
    JavaScrip--Location对象
    安卓奇葩问题之:运行OK,打包安装崩溃(原因是:代码不规范导致编译出错)
    安卓奇葩问题之.so库加载不了
    Fresco简单的使用—SimpleDraweeView
    安卓奇葩问题之SQLite条件查找不到数据
    打包时动态指定一些值
    安卓开发:DateUtils
    SAX解析xml文件
  • 原文地址:https://www.cnblogs.com/ethan-qi/p/3526952.html
Copyright © 2020-2023  润新知