用户、角色、权限管理-设计方案之权限检测

时间:2022-01-24 15:26:51
 在管理软件系统设计中,用户、角色、权限管理是不可缺少的三部分,三者具有如下关系:
User : Role = 1 : n
Role : Permission = 1 : n
如将权限控制到具体的功能模块,又有如下关系:
Role : Module : Permission = 1 : 1 : n

    UserRole的设计很直观,就是1:n的关系表,User、Role均为主键。下面具体谈谈RolePermission的关系设计。
RolePermission完全可以采用和UserRole同样的设计,但要求Role、Module、Permission三个主键,此时处理 Role : Module : Permission的 1 : 1 : n 关系,显得有些费劲。针对于所有的功能模块,Permission 均可划分为以下几种:
1. 列表/查看
2. 新增
2. 修改
4. 删除

    我们可以将“Role : Module : Permission = 1 : 1 : n” 中的“n”想办法变成“1”。设各权限值分别如下(2倍等比递增的关系):
1. 列表/查看 = 2
2. 新增 = 4
2. 修改 = 8
4. 删除 = 16
此时的“Role : Module : Permission”中的Permission等于上述四种操作权限中所拥有的权限值之和,比如:若某个(Role + Module)拥有查看、新增、修改、删除的权限,则其Permission=2+4+8+16=30。

    下面进行权限检测,判断“(Role + Module)”所对应的Permission是否包含上述四种操作权限中的每一个。解决问题关键:使用“&”运算符。比如:
判断Permission是否包含“查看”的权限值,就用 if((Permission & 2) == 2)
判断Permission是否包含“新增”的权限值,就用 if((Permission & 4) == 4)
判断Permission是否包含“修改”的权限值,就用 if((Permission & 8) == 8)
判断Permission是否包含“删除”的权限值,就用 if((Permission & 16) == 16)

    原理(转化为二进制,进行“与”运算):
30 & 2 = 00011110 & 00000010 = 00000010
30 & 4 = 00011110 & 00000100 = 00000100
30 & 8 = 00011110 & 00001000 = 00001000
30 & 16 = 00011110 & 00010000 = 00010000

Feedback

#1楼    回复  引用  查看    

2008-05-16 17:43 by zouzou [未注册用户]
网络兼职中国调客网招聘兼职调查会员
工作地点:不限。全国各地,在家、宿舍、网吧等
技能要求:回答调查公司的市场调查问卷
个人要求:要准备一个电子邮箱,用于接受调查问卷。还要申请支付宝,便于佣金发放。
薪资待遇:每完成一份问卷10~200元
登陆网站了解具体工作岗位www.crw166.cn

#2楼    回复  引用  查看    

2008-05-16 18:40 by 求知无傲      
能不能具体点。

#3楼    回复  引用  查看    

2008-05-16 19:48 by Peter_pan      
这个思路acegi里面好像也在用,类似于位运算的方式

#4楼    回复  引用  查看    

2008-05-16 19:52 by 天真的好蓝啊      
1指定的权限 2拥有的权限 有windows应用程序开发基础的都知道是这样的!



权限判断能力: 1&2 is 1

取消权限: 2&=~1

增加权限: 2||= 1

#5楼    回复  引用  查看    

2008-05-16 20:02 by dddddddddddd [未注册用户]
不太明白,能否再具体写,或者写一个详细的例子~

#6楼    回复  引用  查看    

2008-05-17 06:31 by hhees      
"
2. 新增 = 4
3. 修改 = 8
"
请教下,为什么要把这两个分开,不是很理解,通常新增的就需要修改权限吧,万一新增输入错误怎么办?

#7楼    回复  引用  查看    

2008-05-17 08:50 by 零缺陷生活      
@hhees
但是修改的不一顶需要新增的权限呀!

#8楼    回复  引用  查看    

2008-05-17 08:54 by 零缺陷生活      
其实还有个方法,:
查看,新增,修改,删除
1 0 0 1

把上面的二进制转换为十进制,就是PERMIT_VALUE

#9楼    回复  引用  查看    

2008-05-17 09:52 by 代码乱了      
比如:若某个(Role + Module)拥有查看、新增、修改、删除的权限,则其Permission=2+4+8+16=20。

------------------------------------------------
Permission=应该是30啊!!

另外还有一个问题就是,如果功能权限比较多的话,这个方案就有问题
因为int32的取值范围,你的权限最多限制在32个内,即便再长一点int64,如果我的权限由上百个,这就有一定的局限性了

#10楼    回复  引用  查看    

2008-05-17 10:42 by ABCD [未注册用户]
"如果我的权限由上百个"?
呵呵...有这种假设说明你根本就没看懂作者在写什么....

#11楼    回复  引用  查看    

2008-05-17 10:44 by 笨笨的考拉熊      
这个是*nix系统的权限实现思路,一开始也考虑过这种实现方法,但那个权限项目是固定的,而且不是很多,用了8位二进制。从通用权限系统的角度来说,就不太合适了。因为需要最终用户了解具体实现机制并且还得做编码工作。

#12楼    回复  引用  查看    

2008-05-17 10:49 by 代码乱了      

@ABCD

"如果我的权限由上百个"?
呵呵...有这种假设说明你根本就没看懂作者在写什么....
--------------------------------------------
不要瞎评论,你可以把你的意见说出来

#13楼    回复  引用  查看    

2008-05-17 10:57 by Gray Zhang      
@代码乱了
作者的意思是,权限有n个,不管这个n是几十或者几十万
对于这n个权限中的任意一个,又可分为增、删、查、改4个,这个是定的,某专家也说过,一切操作可以由CRUD表示,所以这是没问题的

比如你的系统有以下权限:
1、对成员的权限 增、删、查、改
2、对帖子的权限 增、删、查、改
3、对评论的权限 增、删、查、改
...
这里的2 + 4 + 8 + 16 = 30,指的是:
2代表增,4代表删,8代表查,16代表改

比如你的权限是
1、对成员的权限: 12,说明你有删和查的权限(4 + 8)
2、对帖子的权限: 30,说明你有所有权限(2 + 4 + 8 + 16)
3、对评论的权限: 8,说明你只能看

所以最多只用到30,不要有你说的Int32不够用的情况

不知道这样有没有说清楚

#14楼    回复  引用  查看    

2008-05-17 11:05 by 笨笨的考拉熊      
一个只有增、删、查、改功能的系统,估计没几个项目能用吧。
我现在权限系统本身为了实现自身基本权限控制,就有列表、查看、增加、删除、修改、执行、分配8种基本权限了。
四种权限怎么实现用户需求的功能呢

#15楼    回复  引用  查看    

2008-05-17 11:14 by Gray Zhang      
@笨笨的考拉熊
这个确实每个项目有所不同,但是能否帮助我理解一下,列表和查看之间的具体区别,以及执行和分配的概念?
最近正需要做权限管理……

#16楼    回复  引用  查看    

2008-05-17 11:18 by 代码乱了      
@Gray Zhang
了解,我看懂了的,多谢!
我也只是一个推论而已,现实真的确上很少有哪一个模块的功能权限有超过上32个的。呵呵。只是假设这种可能性。

#17楼    回复  引用  查看    

2008-05-17 12:31 by 金色海洋(jyk)      
这个好像不是太灵活,如果增加了 打印、导出数据、下载文件等功能怎么办呢?

而且还会有其他的功能的。


ps:有一句话不想说的,这种方式,02年就用了。但是好像还是有些人不太了解。

#18楼    回复  引用  查看    

2008-05-17 14:47 by 笨笨的考拉熊      
@Gray Zhang

列表是列出所有项,查看是打开某一项。好比一个目录里多个文件,有了列表权限,才能看目录中有那些文件;但是否能查看文件中内容就看有没有查看权限了。
执行是看是否授予角色对某个权限(或动作)具有运行权限。
分配是角色是否具有对角色/分组成员的修改权限(分配下属用户)。

有时间可以看一下我写的相关文章,做个参考。互相探讨

#19楼    回复  引用  查看    

2008-05-17 15:02 by COCO笨熊 [未注册用户]
园子里不是有一个开源的asp.net通用权限控制模块吗,和楼主的思路完全一样

#20楼 [楼主]   回复  引用  查看    

2008-05-19 09:15 by 无锋不起浪      
感谢各位关注,不好意思,2+4+8+16=30。用户、角色、权限管理-设计方案之权限检测

@13楼
阐述的很正确,Role-Module-Permission 三个均为主键,可为某Role分配任一Module的“查看、新增、修改、删除”等权限。
此种设计的好处就是使
Role1-Module1-查看
Role1-Module1-新增
Role1-Module1-修改
Role1-Module1-删除
简化成Role1-Module1-Permission(各权值之和)


@17楼
文中四种只是基本操作权值,权限值是可以扩充的(2倍等比递增的关系)。如添加
排序=32
打印/导出=64
等等。