二进制权限控制(一)
标签(空格分隔):工作日志 测试markdown
目录
名词解释
以1为例,1的二进制编码为:0000 0000 0000 0001
-
原码
-
机器原码,1的原码是0000 0000 0000 0001
-
反码
-
正数的原码是自己,除符号位以外(高位)负数的反码按位取反
1:0000 0000 0000 0001
-1:1111 1111 1111 1110
-
补码
-
计算机中对二进制数据的存储,其实存储的都是二进制的补码。
正数的原码是自己;除符号位以外(高位)负数的反码按位取反,然后加1
1:0000 0000 0000 0001
-1:1111 1111 1111 1111
-
计算 1 - 1
-
1 - 1 = 1 + (-1),用补码进行运算:
0000 0000 0000 0001 + 1111 1111 1111 1111 = 0000 0000 0000 0000(高位溢出)
最终结果是 1 - 1 = 1 + (-1) = 0
权限管理
package test;
public class Rights {
public static void main(String[] args) {
int a=1; // 001 状态a
int b=2; // 010 状态b
int c=4; // 100 状态c
int ab = a | b; // 001 | 010 = 011 初始状态
System.out.println(ab | c); // 011 | 100 = 111 添加c的状态
System.out.println(ab & (~b)); // 011 & (~010) = 011 & 101 = 001 去除b的状态
System.out.println((ab & b) == b); // 011 & 010 = 010 判断是否有b的权限:(ab & b)==b
System.out.println((ab & c) == c); // 011 & 100 = 000
}
}
package com.sinosoft;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class AuthTest {
//key:menuid, value:菜单名称
private static Map<String, String> menu = new HashMap<String, String>();
//key:userid, value:操作权限
private static Map<String, String> user = new HashMap<String, String>();
static{
menu.put("1", "用户管理");
menu.put("106", "数据字典");
menu.put("1200", "订单管理");
user.put("zhangsan", "1");
user.put("lisi", "0");
}
/**
* @param args
*/
public static void main(String[] args) {
authorize("zhangsan", "1");
authorize("zhangsan", "106");
authorize("zhangsan", "1200");
System.out.println("===================================");
checkAll("zhangsan");
checkAll("lisi");
System.out.println("===================================");
revoke("zhangsan", "1");
checkAll("zhangsan");
System.out.println("===================================");
revoke("lisi", "1");
checkAll("lisi");
}
/**
*赋权限
*/
private static void authorize(String userid, String menuid){
String rights = user.get(userid); //存的是36进制
BigInteger b36 = new BigInteger(rights, 36);
b36 = b36.setBit(Integer.parseInt(menuid));
user.put(userid, b36.toString(36));
System.out.println("用户["+userid + "]被赋予了[" + menu.get(menuid) + "]的访问权限");
}
/**
*回收权限
*/
private static void revoke(String userid, String menuid){
String rights = user.get(userid); //存的是36进制
BigInteger b36 = new BigInteger(rights, 36);
b36 = b36.clearBit(Integer.parseInt(menuid));
user.put(userid, b36.toString(36));
System.out.println("用户["+userid + "]被收回了[" + menu.get(menuid) + "]的访问权限");
}
/**
*检查用户是否有某一个菜单的访问权限
*/
private static void check(String userid, String menuid){
String rights = user.get(userid); //存的是36进制
BigInteger b36 = new BigInteger(rights, 36);
boolean flag = b36.testBit(Integer.parseInt(menuid));
System.out.println("用户["+userid + "]"+(flag?"有":"没有")+"访问[" + menu.get(menuid) + "]权限");
}
/**
*查询用户所有的访问权限
*/
private static void checkAll(String userid){
for (Iterator<String> it = menu.keySet().iterator(); it.hasNext();) {
check(userid, it.next());
}
}
}
以下是程序执行结果:
用户[zhangsan]被赋予了[用户管理]的访问权限
用户[zhangsan]被赋予了[数据字典]的访问权限
用户[zhangsan]被赋予了[订单管理]的访问权限
===================================
用户[zhangsan]有访问[用户管理]权限
用户[zhangsan]有访问[订单管理]权限
用户[zhangsan]有访问[数据字典]权限
用户[lisi]没有访问[用户管理]权限
用户[lisi]没有访问[订单管理]权限
用户[lisi]没有访问[数据字典]权限
===================================
用户[zhangsan]被收回了[用户管理]的访问权限
用户[zhangsan]没有访问[用户管理]权限
用户[zhangsan]有访问[订单管理]权限
用户[zhangsan]有访问[数据字典]权限
===================================
用户[lisi]被收回了[用户管理]的访问权限
用户[lisi]没有访问[用户管理]权限
用户[lisi]没有访问[订单管理]权限
用户[lisi]没有访问[数据字典]权限