zoukankan      html  css  js  c++  java
  • 一种简单的直观的高效的权限设计

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

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


  • 相关阅读:
    [译]Angular2 和TypeScript -- 一次简要的预览
    浅谈沟通技巧
    浅谈面试官的“被面试”技能
    2020个人总结
    浅谈任务委托与团队建设
    2020已读书单
    2019年个人总结
    目标分析与制定算法
    X短期项目总结
    寻求改变
  • 原文地址:https://www.cnblogs.com/zhuqil/p/Permission.html
Copyright © 2011-2022 走看看