您的位置:首页 > 其它

二进制权限控制(一)

2015-06-25 10:40 417 查看

二进制权限控制(一)

标签(空格分隔):工作日志 测试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

Created with Raphaël 2.1.2计算1 + 1求1的原码:0000 0001求-1的原码:1000 0001求1的补码:0000 0001求-1的补码:1111 11111 +(-1) = 0000 0001 + 1111 1111 = 0000 0000结束

权限管理

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]没有访问[数据字典]权限
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: