二进制权限控制(一)

二进制权限控制(一)

标签(空格分隔):工作日志 测试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 1111 1 +(-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]没有访问[数据字典]权限
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值