`
jsntghf
  • 浏览: 2476414 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

一种简单直观的权限设计

阅读更多

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

 

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

 

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

 

 class User 
{
     bool CanDelete;
     bool CanRead;
     bool CanWrite;
     bool CanModify;
     bool CanCreate;
}

 

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

 

enum PermissionTypes : int 
{
      None = 0,
      Read = 1,
      Write = 2,
      Modify = 4,
      Delete = 8,
      Create = 16,
      All = Read | Write | Modify | Delete | Create
}

class User 
{
      public PermissionTypes Permissions = PermissionTypes.None;
}

 

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

 

 //创建一个用户
User admin = new User();
admin.Permissions = PermissionTypes.Read
    | PermissionTypes.Write
    | PermissionTypes.Delete;
 
//验证权限
bool canRead = ((PermissionTypes.Read & admin.Permissions) == PermissionTypes.Read);
bool canWrite = ((PermissionTypes.Write & admin.Permissions) == PermissionTypes.Write);
bool canCreate = ((PermissionTypes.Create & admin.Permissions) == PermissionTypes.Create);
 
//查看结果
Console.WriteLine(canRead); //true
Console.WriteLine(canWrite); //true
Console.WriteLine(canCreate); //false

 

利用了'|'和'&'两个操作,但是这样看起来很是别扭,初始化权限和验证权限用了一长串'|'和'&'运算的代码,很不直观。我在System.Enum中扩展了一些方法供调用,代码如下:

 

//是否存在权限
public static bool Has<T>(this System.Enum type, T value)
{
    try
    {
         return (((int)(object)type & (int)(object)value) == (int)(object)value);
    }
    catch
    {
         return false;
    }
}

//判断权限
public static bool Is<T>(this System.Enum type, T value)
{
    try
    {
         return (int)(object)type == (int)(object)value;
    }
    catch
    {
         return false;
    }
}

//添加权限
public static T Add<T>(this System.Enum type, T value)
{
    try
    {
         return (T)(object)(((int)(object)type | (int)(object)value));
    }
    catch (Exception ex)
    {
          throw new ArgumentException(
              string.Format(
                     "不能添加类型 '{0}'",
                     typeof(T).Name
                     ), ex);
     }
}
 
//移除权限
public static T Remove<T>(this System.Enum type, T value)
{
    try
    {
          return (T)(object)(((int)(object)type & ~(int)(object)value));
    }
    catch (Exception ex)
    {
          throw new ArgumentException(
              string.Format(
                     "不能移除类型 '{0}'",
                     typeof(T).Name
                     ), ex);
    }
}

 

使用一下:

 

//创建一个用户
User admin = new User();
PermissionTypes permissions = new PermissionTypes();
admin.Permissions = permissions;

//添加权限
admin.Permissions = admin.Permissions.Add(PermissionTypes.Create);
admin.Permissions = admin.Permissions.Add(PermissionTypes.Read);
admin.Permissions = admin.Permissions.Add(PermissionTypes.Write);

//判断权限
bool canRead = admin.Permissions.Has(PermissionTypes.Read); //true
bool canWrite = admin.Permissions.Has(PermissionTypes.Write); //true
bool canDelete = admin.Permissions.Has(PermissionTypes.Delete); //false
bool canCreate = admin.Permissions.Has(PermissionTypes.Create); //true

Console.WriteLine(canRead); //true
Console.WriteLine(canWrite); //true
Console.WriteLine(canDelete); //false
Console.WriteLine(canCreate); //true
Console.Read();

 

现在按照上面的思路,我在SQL Server里面模拟一下上面的操作,在sql中与或运算是很高效的。先设计两张表User和Permission。

 

 

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

 

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

 

 

 

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

 

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

 

 

 

3、判断qilin是否有Delete权限:

 

if exists (select * from [User] where Name='qilin' and  PermissionTypes&8 =8)
  print 'true'
else
  print 'flase'

 

分享到:
评论

相关推荐

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

    大部分系统都有权限系统。...这是一种很简单,很直观,很高效的方式去判定用户的权限。 C#: 好吧,先从最简单开始,定义一个用户(User)类,如下。 代码如下: class User { bool CanDelete; bool Can

    论文研究-一种基于改进RBAC模型的EIS权限管理框架的研究与实现.pdf

    对基于角色的访问控制(RBAC)模型进行了延伸和拓展,提出了一种细粒度权限控制的改进模型FG-RBAC,并在此模型基础上设计开发了一套能为企业信息系统(EIS)开发者和用户提供更简单、更实用、更快速的数据级权限管理...

    浅析关于PHP位运算的简单权限设计

    1.写在最前面最近想写一个简单的关于权限处理的...这样子定义保证了每个权限值(二进制)中只有一个1,而它恰好对应一种权限。比如:复制代码 代码如下:define(‘ADD’, 1); // 增加权限define(‘UPD’, 2); // 修改

    设计一种云级别身份认证结构

    在最近的IT记忆里,云迅速成为了最具爆发力的势力之一。它提供更高的可靠性、更好的灵活度、更低的成本和更简单的部署。...而一种革命性的身份管理方式——联邦式身份认证结构——可以跨越企业和云端的界限。

    基于ASPNET的用户权限设计与实现.pdf

    摘 要 针对管理信息系统中用户权限的复杂性 ...’ $ )在管理信息系统中用户权限控制的一种具体实现方法 实际运行结果表明 本文的设计方案具有运行稳定 使用简单等优点 ’ ! % % 关键词 角色访问控制 用户控件 )*+,-./

    基于角色的用户权限系统设计

    用户 I D和口令这方法也有它的优点: 如简单, 容易 实现等。因此现在的大多数用户权限系统是使用 了用户 I D和口令来识别合法用户。 本设计的系统是在基于角色控制基础上提取 改进而来的, 对使用用户 I D和...

    一个轻量级权限管理系统源码(开发迅速、学习简单、轻量级、易扩展+renren-security).zip

    一个轻量级权限管理系统源码(开发迅速、学习简单、轻量级、易扩展+renren-security).zip一个轻量级权限管理系统源码(开发迅速、学习简单、轻量级、易扩展+renren-security).zip一个轻量级权限管理系统源码(开发...

    Base Admin一套简单通用的后台管理系统.zip

    它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势包括以下几个方面: 跨平台性(Write Once, Run ...

    这是一个统一管理系统权限,设计的目标是给开发者一个完整地权限管理系统,以便你能更专注自己系统业务的开发.zip

    它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势包括以下几个方面: 跨平台性(Write Once, Run ...

    基于rbac设计的权限管理系统.zip

    它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势包括以下几个方面: 跨平台性(Write Once, Run ...

    通用权限的数据库的设计,PowerDesigner

    资源:这里指的资源是广义上的资源,包括很多的东东,模块、数据,菜单、节点、按钮、控件,表、字段、存储过程,页面、窗口、表单、图表、报表,什么都可以算作是一种资源。您也可以把您遇到的一些情况都来算作是一...

    iOS系统中一个统一管理访问权限的工具,让权限管理变得简单。.zip

    软件开发设计:PHP、QT、...云计算与大数据:数据集、包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。

    asp.net一种多商家网络商店的设计与实现(源代码+毕设).zip

    根据网站需求对系统的数据库和功能模块做了详细设计,并在此基础上实现了用户管理模块、权限管理模块、购物订单模块,商家管理模块、商品管理模块、留言板和公告管理模块等功能。最后通过对网站进行的全面测试展现了...

    简单大方的蔬菜售卖网站.zip

    JavaScript,是一种轻量级的解释型编程语言; jQuery,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互; Bootstrap 是快速开发 Web 应用程序的前端工具包。它是一个 CSS...

    一个轻量级权限管理系统

    项目说明 是一个轻量级权限管理系统,其核心设计目标是开发迅速、学习简单、轻量级、易扩展 使用renren-security搭建项目,只需编写30%左右代码,其余的代码交给系统自动生成 一个月的工作量,一周就能完成,剩余的...

    简单仓库管理系统软件2017破解版

    支持一种货品多个型号、多个仓库情况的管理; 支持货品的无限分级分类支持先进先出、移动平均加权等多种记长方法; 支持条码打印、识别;支持首拼码; 支持报表的自定义设计;支持产品图片管理,支持小数数量出入库...

    JAVA毕业设计ssm jsp人才公寓管理系统项目(ssm完整源码+说明).zip

    JAVA毕业设计ssm jsp人才公寓管理系统项目是...总之,JAVA毕业设计ssm jsp人才公寓管理系统项目是一个简单而实用的系统,为人才公寓的管理提供了一种便捷的解决方案,同时也为开发人员提供了一个良好的学习和实践平台。

    基于Java的权限管理系统设计论文

    比较几种常见的访问控制方式的优缺点,目前信息系统的权限管理的需求进行分 析。本文结合公司的基础技术平台的典型应用需求为背景,初步探索了访问控制 的理论、方法以及基本流程,并在此基础上设计了权限管理系统的...

    计算机专业毕业设计-Java.rar

    计算机管理系统:这是一种用于管理计算机设备和网络的软件系统。它可以帮助管理员对计算机资源进行监控和管理,包括硬件设备、软件安装和更新、用户账户和权限等。 考试系统:考试系统是一种用于电子化考试管理和...

    基于Springboot和Vue的简单人事管理系统设计源码

    本设计源码提供了一个基于Springboot和Vue的简单人事管理系统。项目包含69个文件,主要使用Java、HTML和CSS编程语言。文件类型包括23个Java源代码文件、17个PNG图片文件、8个HTML页面文件、6个XML配置文件、5个GZ...

Global site tag (gtag.js) - Google Analytics