java基于二进制位运算的权限管理

本文介绍了如何在Java中运用二进制位运算进行权限管理。通过位运算符如&和|,结合二进制表示,实现了权限的灵活组合。以后台工具的管理权限和Linux文件系统的权限设置为例,阐述了这种基于二进制的运算方式。同时,文章提到了系统管理登录表、管理员权限分配表等设计,并给出了部分 Dao 层和控制器代码的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,什么是位运算

什么是位运算

主要是使用到“位运行符”操作,&位与运算符,| 位或运行符。参与运算的如果是10进制数,则会被转换至2进制数参与运算,然后计算结果会再转换为10进制数输出
.2 ^ 0 = 1,相应2进数为“0001”(这里^我表示成“次方”,即:2的0次方,下同)
2 ^ 1 = 2,相应2进数为“0010”
2 ^ 2 = 4,相应2进数为“0100”
2 ^ 3 = 8,相应2进数为“1000”

优点
        位运算的运算对象是二进制的位,速度快,效率高,而且节省存储空间,位运算做权限控制又相当地灵活。Linux系统的文件权限的实现方式,就是采用了位运算
缺点:
        1.该权限控制基于二进制位运算,所以角色权限ID必须为2的倍数,如2的0,1,2,3,4...63-1次方;
        2.数据库和Java程序中有符号的长整型最大为 2^63-1 加上原来的1 最多只可能有63(62+1)条权限。但这在实际的应用中63条权限显然是不够的;
解决的办法:
          1>给权限表添加一项权限组字段(rpos)
          2>该字段从0开始,当权限码数量即将要满的时候,该字段加一
          3>这样就可以有 n*63(63这里是最大值可以适当缩小)
          4>用户权限总和采用long[]数组进行存储,每一权限组对应数组的下标。
            例如:
            public boolean hasRight(Rights r) {
              return (rigths[r.getRpos()] & r.getRcode()) != 0;
            }

示例1

比如后台工具的管理权限

//定于权限 2的n次方
var ADD = 1; // 增加权限
var UPD = 2; // 修改权限
var SEL = 4; // 查找权限
var DEL = 8; // 删除权限

// 给予某种权限用到"位或"运算符
var GROUP_A = ADD | UPD | SEL | DEL; // A 拥有增删改查权限
var GROUP_B = ADD | UPD | SEL; // B 拥有增改查权限
var GROUP_C = ADD | UPD; // C 拥有增改权限

// 禁止某种权限用"位与"和"位非"运算符
$GROUP_D = GROUP_C & ~UPD; // D 只拥有了增权限


//检测某个用户是否有这个权限
console.log("A用户组成员是否有增加权限"+ ((GROUP_A & ADD) > 0))
console.log("A用户组成员是否有删除权限"+ ((GROUP_A & DEL) > 0))

console.log("B用户组成员是否有增加权限"+ ((GROUP_B & ADD) > 0))
console.log("B用户组成员是否有删除权限"+ ((GROUP_B & DEL) > 0))

console.log("C用户组成员是否有增加权限"+ ((GROUP_C & ADD) > 0))
console.log("C用户组成员是否有删除权限"+ ((GROUP_C & DEL) > 0))

console.log("D用户组成员是否有增加权限"+ ((GROUP_C & ADD) > 0))
console.log("D用户组成员是否有删除权限"+ ((GROUP_C & DEL) > 0))

示例2

在Linux文件系统中,一个用户对文件或目录所拥有的权限分为三种:“可读”,“可写”和“可执行”,分别用1,2和4来表示,它们之间可以任意组合:有“可读”,“可写”权限就用3来表示(1 + 2 = 3);有“可读”,“可执行”权限就用5来表示(1 + 4 = 5) ,三种权限全部拥有就用7表示(1 + 2 + 4 = 7)
实际上,这种运算是基于二进制的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值