二进制实现权限的分配管理

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

 

 

 

 

 

【项目内容描述】

ASP.NET 权限管理系统设计具体需求

 

1、 应包括以下模块:功能模块管理、角色管理、用户管理、角色授权、用户授权

         功能模块管理:管理系统中可用模块的地址、功能在HTML页面的显示功能名和树状结构(即上下级关系)等,已经增加的项目不可实际删除,可采用删除标记方式来记录已经被删除的功能

         角色管理:为方便用户授权而使用的一组权限集合体,可选择一个或多个用户(如多个一次同时授权不能实现,也可单个独立授权)进入角色权限管理模块

         用户管理:管理参与系统操作的用户信息,每个用户都必须是和其管理业务相关的部门下员工,提供用户管理到用户授权的关系链接

         角色授权:系统中存在的角色进行授权操作,一个角色可授权多个功能模块,一个功能模块也可授权给多个角色,系统提供角色选择的查询界面,可选择一个或多个用户(如多个一次同时授权不能实现,也可单个独立授权)同时进行可操作功能模块的授权管理,每个功能模块上又有多个操作按钮,也需要进行权限控制

         用户授权:对系统中存在的用户进行授权操作,一个用户可授多个角色权限,也可授多个直接的功能模块权限,每个功能模块上又有多个操作按钮,也需要进行权限控制

         (注:用一个字段记录此按钮权限,对每种权限使用一位数据的方式来判断是否具有此功能,如:审核——第1位、新增——第2位、修改——第3位、删除——第4位,则1011表示,此用户或角色具有:查询、修改、删除权限,但不具有新增权限)

         按钮功能采用规定按钮ID和名称的形式进行控制(按钮名称为:新增:btn_Add,修改:btn_Edit,删除btn_Delete)

         用户权限能够控制到数据级,即:上级部门的用户能够观看下级用户的数据,而下级用户不能观看上级用户生成的数据。注:此数据由数据的组织机构编码来判断。

         用户进行权限管理时,除ADMIN用户能增加顶级用户外,其他用户只有增加比本用户权限更低级的用户,系统只有一个ADMIN用户,且不可维护。ADMIN用户不属于任何一个部门(即此用户不能参与业务操作)

2、 用户登录后,系统根据用户登录权限,自动将其能够操作的功能树展现,但只展现其能够使用的功能权限树,

3、 菜单树分为2层:分布在上方的为一级菜单树,分布在左方的为二级以下菜单树(含二级)且能够与一级菜单树产生JS连动效果

4、 能够控制界面上按钮(查询、新增、修改、删除)等多种操作单独设置

5、 能够根据数据库中的模块结构生成相应的功能模块树(型结构)

6、 授权时,应考虑菜单的父子关系,如:授予子节点A1权限时,其父节点A的访问权限必须获得授权

7、授权界面显示最好能够将功能模块的父子关系显示出来

8、 符合数据库设计要求:

用户信息表可自主创建,但必须包括后面用户信息表(POPEDOM_USER)中定义的几个字段

其中:

EMP_ID来自员工基本信息表EMP_ID

LOGIN_ID是指用户用来登录系统使用的ID

LOGIN_PASSWORD

表中创建人ID和创建时间为此数据第一次创建时的操作员及时间(创建人填写的为EMP_ID而不是登录ID)

表中修改人ID和修改时间为本次修改时的操作员及时间,若为第一次,此项输入与创建人ID和创建时间相同,

其他的表只是参考实现,可以进行表名及模块名的变更,另:用户与功能模块对应表未创建,可参照用户与角色表进行创建。

 

 

9、 数据库参考实现:

用户信息表 POPEDOM_USER

英文字段名       中文字段名       数据类型及长度   是否可为空        备注

EMP_ID   员工信息表ID     CHAR(24)         PK

LOGIN_ID 登录ID  VARCHAR(50)      是      

LOGIN_PASSWORD   登录帐户密码     VARCHAR(50)      是      

 

系统模块基本表 POPEDOM_MODULE

英文字段名       中文字段名       数据类型及长度   是否可为空        备注

MODULE_ID        系统模块基本表ID CHAR(24)         PK

MODULE_NAME      模块名称 VARCHAR(50)              

MODULE_PATH      模块路径 VARCHAR(50)              

SUPMODULE_ID     上级模块ID       CHAR(24)         FK

DESCR    描述     VARCHAR(200)     是      

CREATE_EMPID     创建人ID CHAR(24)         FK

CREATE_DATE      创建时间 DATETIME        

UPDATE_EMPID     修改人ID CHAR(24)         FK

UPDATE_DATE      修改时间 DATETIME        

DEPT_CODE        组织机构编号     Varchar(32)               FK

ISDEL    删除标示 CHAR(1)          0否1是

 

角色基本表 POPEDOM_ROLE

英文字段名       中文字段名       数据类型及长度   是否可为空        备注

ROLE_ID  角色基本表ID     CHAR(24)         PK

ROLE_NAME        角色名称 VARCHAR(50)              

DESCR    描述     VARCHAR(200)     是      

CREATE_EMPID     创建人ID CHAR(24)         FK

CREATE_DATE      创建时间 DATETIME        

UPDATE_EMPID     修改人ID CHAR(24)         FK

UPDATE_DATE      修改时间 DATETIME        

DEPT_CODE        组织机构编号     Varchar(32)               FK

ISDEL    删除标示 CHAR(1)          0否1是

 

 

角色控制模块的权限表 POPEDOM_ROLECORR_MODULE

英文字段名       中文字段名       数据类型及长度   是否可为空        备注

ROLECORR_MODULE_ID        角色控制模块的权限表ID    CHAR(24)          PK

ROLE_ID  角色基本表ID     CHAR(24)         PK

MODULE_ID        系统模块基本表ID CHAR(24)         PK

RIGHT_SIGN       权限标示 CHAR(8)          权限标示(1审核2添加3修改4删除) 0000

DESCR    描述     VARCHAR(200)     是      

CREATE_EMPID     创建人ID CHAR(24)         FK

CREATE_DATE      创建时间 DATETIME        

UPDATE_EMPID     修改人ID CHAR(24)         FK

UPDATE_DATE      修改时间 DATETIME        

DEPT_CODE        组织机构编号     Varchar(32)               FK

ISDEL    删除标示 CHAR(1)          0否1是

 

用户与角色对应表 POPEDOM_EMPCORR_ROLE

英文字段名       中文字段名       数据类型及长度   是否可为空        备注

EMPCORR_ROLE_ID  用户与角色对应表ID        CHAR(24)         PK

EMP_ID   用户ID  CHAR(24)         FK

ROLE_ID  角色基本表ID     CHAR(24)         FK

DESCR    描述     VARCHAR(200)     是      

CREATE_EMPID     创建人ID CHAR(24)         FK

CREATE_DATE      创建时间 DATETIME        

UPDATE_EMPID     修改人ID CHAR(24)         FK

UPDATE_DATE      修改时间 DATETIME        

DEPT_CODE        组织机构编号     Varchar(32)               FK

ISDEL    删除标示 CHAR(1)          0否1是

 

【接包方必备的条件】

精通C#与ASP.NET

有丰富的权限管理系统设计经验

有现成可用的类似权限管理模块最好

 

转载于:https://www.cnblogs.com/lyunyu/p/3681228.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值