您的位置:首页 > 其它

WebOA系统权限管理中设置CRUD及其相关的思想

2009-09-23 16:47 375 查看
WebOA系统权限管理中设置CRUD及其相关的思想

对某个模块的权限主要包括以下四种操作:
C----------Create添加
R----------Read读取
U----------Update更新(修改)
D----------Delete删除
权限管理模块中,这四个操作是由一个叫做Permission的类来表示的,它的属性只有由四个已定义好的常量 CREATE = 0 READ = 1 UPDATE = 2 DELETE = 3

下面主要是关于如何设置这四种操作的说明。
阐述几个变量的含义:
aclState-----表示授权状态,一个整型的最后四位表示,即含有哪几种操作的整形数值,存储在数据库中为32bit的整型变量
【由1、2、4、8四个数字或他们某几个的和组成,可能的值有1~15】
permission-----CRUD操作,只能取值0、1、2、3其中之一
aclTriState-----继承的状态,0表示不继承,-1表示表示继承
【由于授权包括直接给用户授权和给角色授权,不继承表示直接授权、继承则表示用户拥有某些角色的授权】
ACL_YES-----授权允许
ACL_NO-----授权不允许
ACL_NEUTRAL-----授权不确定
【注:授权允许与否是指aclState的值中是否含有某种操作permission(CRUD)】

用于设置权限的ACL.java(访问控制列表Access Control List)类中的主要方法
/**
* acl实例跟主体和资源关联(实际上就是设置aclState的值)
* 针对此实例进行授权:某种操作是否允许
* @param permission 只可以取值0,1,2,3
* @param yes true表示允许,false表示不允许(添加还是不添加这其中某个操作C/R/U/D)
*/
public void setPermission(int permission, boolean yes){
int tmp = 1;
tmp = tmp << permission;
if(yes){
aclState |= tmp;
}else{
aclState &= ~tmp;
}
}
/**
* 获得ACL授权(根据permission判断aclState是否含有某个操作C/R/U/D)
* @param permission C/R/U/D权限
* @return 授权标识:允许/不允许/不确定
*/
public int getPermission(int permission){
//如果继承(-1),则返回不确定的授权信息
if(aclTriState == 0xFFFFFFFF) {
return ACL_NEUTRAL;
}
int tmp = 1;
tmp = tmp << permission;
tmp &= aclState;
if(tmp != 0) {
return ACL_YES;
}
return ACL_NO;
}
/**
* 设置本授权是否是继承的
* @param yes true表示继承,false表示不继承
*/
public void setExtends(boolean yes){
if(yes){
aclTriState = 0xFFFFFFFF;
}else{
aclTriState = 0;
}
}
分别解释上面三个方法
1setPermission(int permission, boolean yes)设置操作是否允许
即将传入的permission设置到aclState的值中:添加某操作还是去除某操作。
定义临时变量tmp=1,然后tmp左移permission位(0、1、2、3位)
添加的话:aclState |= tmp; 即aclState与tmp作或(|)运算并返回值
去除的话:aclState &= ~tmp; 即aclState与tmp取反后作与(&)运算并返回值
例如:
若原来aclState的值为12(二进制即位1100,含有U和D操作),现在若要添加R(1)
1. tmp(0001)左移1位,即现在tmp为0010
2. aclState(1100)与tmp作或运算,即1100 | 0010 ,结果是1110,即为添加R操作后aclState的值了(十进制为13,加上了R操作)
若原来aclState的值为12(二进制即位1100,含有U和D操作),现在若要去掉已有的U(2)
1. tmp(0001)左移2位,即现在tmp为0100
2. tmp取反后~tmp为1101,aclState(1100)与1011做和运算,即1100 & 1011 ,结果为1000,即为去掉了U操作aclState的值(十进制为8,去掉了U操作)
2getPermission(int permission) 获得ACL授权
即根据permission判断aclState是否含有某个操作C/R/U/D),返回 允许/不允许/不确定 的整型值
1. 若aclTriState为-1,表示用户的授权时继承自角色的,故其是否含有permission操作不确定ACL_NEUTRAL;
2. 若aclTriState不为-1,表示用户的权限是直接授予的。定义临时变量tmp=1,将其左移permission位,并与aclState作与运算,判断其值是否为0:若不为0,则表示原aclState中含有传入的permission操作;若为0,则表示原aclState中不含有传入的permission操作。
例如:
若原来aclState的值为12(二进制即位1100,含有U和D操作),现在若传入的permission为2(即判断是否含有U操作),且是继承的。
1. tmp(0001)左移2位,即现在tmp为0100
2. tmp与aclState(1100)作与运算,即1100 & 0100 , 结果为0100(十进制为4),不为0,故此断定:值为12的aclState必含有U(2)操作。
若原来aclState的值为12(二进制即位1100,含有U和D操作),现在若传入的permission为1(即判断是否含有R操作),且是继承的。
1.t mp(0001)左移1位,即现在tmp为0010
2.tmp与aclState(1100)作与运算,即1100 & 0010 , 结果为0000(十进制为0),为0,故此断定:值为12的aclState必不含有R(1)操作。
3setExtends(boolean yes) 设置本授权是否是继承的
是继承-----将aclTriState设置为-1;
不继承-----将aclTriState设置为0。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐