OA之权限管理

来源:互联网 发布:origin作图软件 编辑:程序博客网 时间:2024/05/17 03:16

权限管理自己做完了,但是很多的研究和总结,现在就来总结一下权限管理。

第一、数据库中主要类:

主要负责类:用户(User),角色(Role)、资源(module)和操作(Permission)

衍生类:用户角色(UserRole)和对某个资源的某个操作(ACL)

第二、ACL的具体理解:

一条acl授权记录中主要记录了以下信息: 角色、资源和授权 

授权作为一个int, 每一位是一个操作的权限. 

假设从右向左, 分别代表CRUD 

那么, 我们CRUD的代码就应该是0123(也就是移位时要移的位数), 因为我们要进行移位进行认证。

先看授权与取消授权的代码:

public void setPermission(int permission,boolean yes){int temp = 1;temp = temp << permission;if(yes){aclState |= temp;}else{aclState &= ~temp;}}

首先, 一个int temp = 1的临时变量, aclState为原始授权状态

tmp的二进制表示是: 00000000 00000000 00000000 00000001 


U对应的代码是U, 对应的是2. 


将tmp左移2位, temp = tmp < < 2; temp变成:00000000 00000000 00000000 00000100 


假设原始授权是aclState=00000000 00000000 00000000 00001010 


当变量yes=true时,为授权,将temp与aclState求|运算,因为temp现在只有他要授权的位为1,求或运算后,


aclState=00000000 00000000 00000000 00001110,这样就授权成功


当变量yes=false时,为取消授权,先将temp取反,即为11111111 11111111 11111111 11111011,


现在只有要取消权限的位为0,其余全为1,然后与aclState求&运算,则除了要取消权限的位变0,其余的都不变,


即aclState=00000000 00000000 00000000 00001010


再来看认证:

public int getPermission(int permission){                  int temp = 1;temp = temp << permission;temp &= aclState;if(temp != 0){return ACL_YES;}return ACL_NO;}

认证更简单,直接将temp变量与aclState求&,temp为1的位为要验证的权限,其余全为0,如果aclState的这一位为1,则结果不为零,即有该权限;若aclState这一位为0,即没权限,则结果为0,没有该操作权限

总结:权限管理最难理解的就是CRUD中的数据得来,至于别的我们可以关系,我们还是可以清晰的理解,还有一个概念就是集成的概念:

a)        针对某个资源的所有操作,我们可以设置这些权限对用户来说是“继承”或“不继承”

                        i.             继承:意思是这些权限将使用其(即用户)所拥有的角色的权限,而不使用其(即用户)单独设置的权限

                      ii.             不继承:意思是这些权限将使用其单独设置的权限,而不使用其所拥有的角色的权限