菜单按钮权限,通过一个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;
}

数据权限

03-23 04:51