`
jsntghf
  • 浏览: 2542899 次
  • 性别: 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'

 

分享到:
评论

相关推荐

    laravel权限设计笔记

    一个角色可以拥有多个权限,一种权限可以被多个角色所拥有。角色是权限设计的核心概念。 权限(Permission) ------------- 权限是指系统中的一个操作或行为,例如创建、读取、更新、删除等。权限是权限设计的最小...

    一种简单方便的用户权限管理方法

    ### 一种简单方便的用户权限管理方法 #### 权限管理背景与意义 在软件开发过程中,特别是对于大型系统或企业级应用来说,权限管理是非常关键的一个环节。它不仅能够确保系统的安全性,还能够帮助组织根据不同的...

    应用程序权限设计-权限的控制程度不同的设计方案

    **概念**:基于角色的权限设计(Role-Based Access Control, RBAC)是一种常见的权限管理方法,它通过赋予用户不同的角色来控制其访问权限。每个角色都与一组预定义的操作权限关联,用户通过获得这些角色间接获得...

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

    在权限设计中,位运算特别有用,因为它可以简洁快速地判断和设置权限状态。...对于需要对权限控制有更深入理解的开发者来说,PHP位运算提供了一种简单而强大的工具,能够在需要的时候进行非常精细的权限操作。

    权限设计原理

    权限设计是一项复杂的任务,但本质上可以简化为一种逻辑判断:“谁(Who)对什么(What)进行了怎样的(How)操作”。权限设计的目标是在项目的实际需求和架构之间找到平衡点,确保权限系统的维护性、灵活性以及完整...

    Java基本的权限设计

    Java权限设计是构建安全应用程序的关键组成部分,它涉及到对系统资源的访问控制,确保只有授权的用户和角色才能执行特定的操作。以下是对标题和描述中提到的知识点的详细说明: 1. **实体设计**: 在Java权限设计...

    简单的权限实现

    一种常见的方法是通过角色(Role)和权限(Permission)的概念。角色是权限的集合,一个用户可以被分配一个或多个角色。当用户登录系统时,系统会根据其角色授予相应的权限。这样,我们可以通过判断用户的角色来决定...

    一个简单的权限管理Dome

    3. **权限设计**: - 动态权限:在系统中,权限可以动态分配和调整,以适应业务需求的变化。这包括对角色权限的增删改以及用户角色的调整。 - 权限继承:角色之间可能存在层级关系,上级角色的权限可以被下级角色...

    简单权限管理系统

    MVC(Model-View-Controller)是一种常见的软件设计模式,常用于Web应用开发。在这个系统中,MVC模式用于分离业务逻辑(Model)、用户界面(View)和控制逻辑(Controller)。Model负责处理数据和业务逻辑,View负责...

    简单的权限控制系统

    "简单的权限控制系统"这个主题主要探讨了如何设计和实施一个基础的权限控制方案,它涉及到用户、角色和权限这三者之间的相互作用。在这个系统中,用户是操作的主体,角色是权限的集合,而权限则定义了用户可以进行的...

    应用程序系统中权限的设计——数据库设计

    5. **涉及实体资源的权限设计**:当用户对某一实体的不同记录有不同的访问权限时,如内容管理系统中用户对某些频道有修改权限,而对其他频道没有,就需要为每种资源创建单独的权限表,如`UserActionContent`和`...

    权限设计大纲

    ### 权限设计大纲 #### 一、权限设计的核心概念 **权限设计**是指在软件系统中,为了保障系统的安全性和可操作性,通过合理的权限分配机制,来控制不同用户对于系统内各种功能的访问权限的过程。这既包括对用户...

    php 简单的权限管理系统

    1. **权限设计**: - 增加(Add):允许用户创建新的数据项,如发布文章、添加用户等。 - 删除(Delete):允许用户移除已存在的数据,如删除文章、禁用用户等。 - 查找(Read/View):让用户能够浏览和检索信息...

    Needs,:closed_伞形:一种实现现代权限指令弹出式菜单的简单方法。.zip

    总的来说,"Needs"项目提供了一种创新的方式来处理权限管理,通过现代UI设计使得权限指令的控制更加直观。对于希望提升用户体验并优化权限管理流程的开发者来说,这是一个值得探索和使用的开源解决方案。通过深入...

    简单的权限设置源代码

    首先,XtraGrid是DevExpress提供的一种强大的数据网格控件,它提供了丰富的功能,如数据编辑、排序、过滤和分组等。在权限管理场景中,XtraGrid可以用来显示用户或角色的权限列表,并允许管理员进行增删改查操作。...

    一种基于树型结构的BS系统权限控制方法

    一种基于树型结构的BS系统权限控制方法,是IT领域内一种创新的权限管理策略,尤其适用于基于浏览器/服务器(B/S)架构的信息系统。这种方法不仅优化了传统的基于角色的访问控制(RBAC)技术,还针对Web信息系统中...

    简单实用权限管理系统

    - **基于角色的访问控制(RBAC)**:最常见的一种模型,用户通过其所属的角色获取权限。 - **基于对象的访问控制(OBAC)**:更关注于数据对象本身,允许对每个对象设置独立的访问权限。 - **基于规则的访问控制...

    信息管理系统中通用的权限设计

    1. **基于角色的权限设计**:这是一种最基础且广泛采用的方法。系统中预设不同的角色(如管理员、普通用户等),每个角色赋予特定的操作权限集合。在程序执行时,通过判断用户所属的角色来决定其能否执行某项操作。...

    基于AOP的大赛信息管理系统权限设计

    为了解决这些问题,本文提出了一种基于AOP(面向切面编程)的权限设计方案。 AOP是一种编程范式,旨在提高代码的模块化和可维护性,特别是在处理跨越多个模块的横切关注点时。它引入了“切面”概念,将这些关注点...

Global site tag (gtag.js) - Google Analytics