二进制权限控制(一)
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]没有访问[数据字典]权限
相关文章推荐
- 前端开发中常见的HTML5标签乱用案例
- iOS#define和static const
- SharedPreferences中的MODE_APPEND 和 MODE_PRIVATE 区别
- gradle多渠道打包及友盟统计-eclipse版本
- DML、DDL、DCL区别
- LeetCode_49---Anagrams
- 《Java程序设计》第16周周四:GUI编程及文件对话框的使用(项目1)
- AIX平台下面long的长度与编译选项-q64的关系
- C++中头文件的现状
- 树的基本运用二
- opencv各种滤波分析bilateralFilter、Laplacian、bitwise_and和GaussianBlur
- 10.11 Beta 2 上不能运行xcode6.3.2了
- orika的问题
- mysql 索引
- gzip和gunzip 解压参数
- java 动态代理
- jquery实现浮动的侧栏实例
- jQuery Mobile知识点总结
- 使用Java VisualVM监控远程JVM
- 泛型的使用