权限管理自己做完了,但是很多的研究和总结,现在就来总结一下权限管理。
第一、数据库中主要类:
主要负责类:用户(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. 不继承:意思是这些权限将使用其单独设置的权限,而不使用其所拥有的角色的权限