二进制权限控制(一)

来源:互联网 发布:数据库开发师工资 编辑:程序博客网 时间: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

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]没有访问[数据字典]权限
0 0
原创粉丝点击