OA之权限管理
权限管理自己做完了,但是很多的研究和总结,现在就来总结一下权限管理。第一、数据库中主要类:主要负责类:用户(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. 不继承:意思是这些权限将使用其单独设置的权限,而不使用其所拥有的角色的权限
做爱做的事,交配交的人。 人生重要的不是所站的位置,而是所朝的方向! 修养的艺术,其实就是说谎的艺术。 微机原理闹危机,随机过程随机过,实变函数学十遍,汇编语言不会编! 内练一口气,外练一口屁。 死亡教会人一切,如同考试之后公布的结果——虽然恍然大悟,但为时晚矣~!
页:
[1]