菜单按钮权限,通过一个0到15的整数移位来控制
/**
* 授权状态,用后4位来标识CRUD操作 0-0000 1-0001 2-0010 3-0100
* 0 C:1 3 5 7 9 11 13 15
* 1 R:2 3 6 7 10 11 14 15
* 2 U:4 5 6 7 12 13 14 15
* 3 D:8 9 10 11 12 13 14 15
*/
private int aclState;
/**
* 授权/取消授权
* acl实例跟主体和资源关联
* 根据此实例进行授权:某种操作是否允许
* @param permission 只可取值0-C,1-R,2-U,3-D
* @param yes true表示授权允许,false表示授权不允许
*
* 1 二进制 00000001
* ~temp 11111110
*
* create权限:permission = 0,yes = true
* 1向左移位0位,二进制是 00000001
* aclState=0,二进制是 00000000
* 或运算符:| 相同位有一个为1则取1,都为0才取0
* 00000000
* 00000001
* true: 00000000 | 00000001 = 00000001 = 1
* 与运算符:& 相同位都为1则取1,否则取0
* 00000000
* 11111110
* false: 00000000 & 11111110 = 00000000 = 0
*
* read写限:permission = 1,yes = true
* 1向左移位1位,二进制是 00000010
* aclState=1,二进制是 00000001
* 或运算符:| 相同位有一个为1则取1,都为0才取0
* 00000001
* 00000010
* true: 00000001 | 00000010 = 00000011 = 3
* 与运算符:& 相同位都为1则取1,否则取0
* 00000001
* 11111101
* false: 00000001 & 11111101 = 00000001
*/
public void setPermission(int permission, boolean yes) {
int temp = 1;
temp = temp << permission;
if(yes) {
aclState |= temp;
} else {
aclState &= ~temp;
}
}
/**
* 获得ACL授权
* @param permission C/R/U/D权限
* @return 授权状态,允许/不允许/不确定
*
* aclState = 3 = 00000011
* temp = 1 = 00000001
*
* 获取create权限:
* permission = 0
* temp向左移0位:00000001
* 00000001
* 00000011
* 00000001 & 00000011 = 00000001 = 0
*
* 获取read权限:
* permission = 1
* temp向左移1位:00000010
* 00000010
* 00000011
* 00000010 & 00000011 = 00000010 = 2
*
* 获取update权限:
* permission = 2
* temp向左移2位:00000100
* 00000100
* 00000011
* 00000100 & 00000011 = 00000000 = 0
*/
public int getPermission(int permission) {
// if(extendsState == 0xFFFFFFFF) {
if(extendsState == -1) {
return ACL_NEUTRAL;
}
int temp = 1;
temp = temp << permission;
temp &= aclState;
if(temp != 0) {
return ACL_YES;
}
return ACL_NO;
}
数据权限