二进制权限控制(一)
来源:互联网 发布:数据库开发师工资 编辑:程序博客网 时间:2024/04/27 20:09
二进制权限控制(一)
标签(空格分隔):工作日志 测试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]没有访问[数据字典]权限
0 0
- 二进制权限控制(一)
- 二进制权限控制(二)
- 使用二进制 权限控制
- 使用二进制权限控制
- 二进制权限控制
- 二进制权限控制
- JSP权限控制(一)
- hive权限控制(一)
- 使用二进制进行权限或状态控制
- 通过二进制对权限进行控制
- 《权限系列》----用SpringAop控制权限一
- 实现struts2的CRUD中的权限控制(一)
- 实现struts2的CRUD中的权限控制(一)
- ASP.NET对HTML元素进行权限控制(一)
- ASP.NET MVC程序权限控制解决方案(一)
- Yii2-权限控制RBAC实战篇(一)
- Yii2-权限控制RBAC-理论篇(一)
- Redis实现Restful的访问权限控制(一)
- 数据统计存储过程规范(mysql)
- Android中notifyDataSetInvalidated()和notifyDataSetChanged()有什么区别
- socketio 服务器推送
- 织梦dedecms转Joomla!——文章目录的数据库转存
- 前端开发中常见的HTML5标签乱用案例
- 二进制权限控制(一)
- Mac Android开发1:MAC中设置android adb环境变量
- 检测字符串中的是否包含除中英数字的字符(中文,英文)
- 关于多核与单核、并行与并发
- edittext SearchView 失去焦点问题
- linux命令十:vi
- iOS#define和static const
- PropertyPlaceholderConfigurer详解2
- python nltk自然语言处理学习笔记1