假设表中有以下数据:
用户组表:
iGUID
|
vGroup_Name
|
1
|
Egenera
|
权限表:
iPID
|
iPermission_Bit
|
vPermission_Name
|
1
|
0
|
增加RoadMap
|
2
|
1
|
修改RoadMap
|
3
|
2
|
删除RoadMap
|
4
|
3
|
增加Project
|
5
|
4
|
修改Project
|
备注:iPermission_Bit的数字范围为0~31之间,且不能重复
现在我们用1个long型的数据结构来存放权限之和,1个long型有32位,1位对应一种权限操作,那么它可以表示32种操作,故上面的权限表中最多只能32条记录。
假设Administrator拥有以上5种操作:那么它对应的权限之和的二进制就是:
00000000 00000000 00000000 00011111
化成十进制就是:1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 +1*2^0 =31
假设PM拥有”增加Project”和”修改Project”,那么它的权限和是: 1*2^4 + 1*2^3 =24
假设User什么权限都没有,那就为0了
角色表:
iRoleID
|
vRole_Name
|
iPermissions
|
1
|
Administrator
|
31
|
2
|
PM
|
24
|
3
|
User
|
0
|
用户表:
iUID
|
vUser_Name
|
iGUID
|
iRoleID
|
InherUID
|
1
|
张三
|
1
|
1
|
|
2
|
李四
|
1
|
2
|
|
3
|
王五
|
1
|
2
|
|
4
|
小明
|
1
|
2
|
2
|
5
|
小强
|
1
|
3
|
|
用户登录系统时,系统首先从数据库取出该用户所属角色的权限和Sum,再判断该用户是否继承了其他用户,若有继承其他用户A,再取出A的权限和Sum2,Sum 跟 Sum2 进行或运算后,结果作为该用户的权限和保存在session中。
假如小强想要增加Project,那么系统首先对小强所拥有的权限进行判断。
表中的记录说明小强没有 增加project的权限
假如李四要增加Project。系统对李四的权限判断是这样进行的:”增加Project”操作对应的是第3位,系统首先判断李四所属角色的权限和二进制数的第3位是否为1。这个可以通过位的与运算来实现。
李四所属角色的权限和为24 。 只要 23 & 24==23 ,就表示李四有”增加Project”的操作。
OK,李四成功地增加了Project,名字为BBB
因为Project BBB是由李四创建的。
Project表:
iProjectID
|
vProject_Name
|
iUID
|
1
|
AAA
|
1
|
2
|
BBB
|
2
|
3
|
CCC
|
3
|
假如其他用户要修改Project呢?
1、张三属于系统管理员,他的角色比李四大,故可以修改Project BBB。
2、王五不可以修改Project BBB,因为王五跟李四同属一个角色。且创建该Project的iUID不等于王五自身的iUID和继承来的InherUID。
3、小明可以修改Project BBB,因为小明继续了李四的权限。