基于二进制的权限管理与验证

 





《《------------------------参考资料------------------------------------

二进制权限控制涉及到的3种运算

-----------------------------------

1,<<  左移运算,设定权限码,

例如:权限1的权限码为1 ,权限2的权限码为1<<1=2  权限3的权限码为2<<1=4

2,|  或运算,计算权限总值,(long)总值=1 | 2 | 4 = 4

3,& 与运算,验证是否有权限  权限总值&权限码!=0则有权限,

例如:int i = 4 & 2; i不等于0则有2这个权限 


要注意的问题:

-----------------------------------

1,权限码的类型必须为 long,long型最多存储64位,去除一个符号位,去除1,所以最多能左移62位,导致的问题:权限根本不够存。

2,所以 引入权限组的概念,每一个权限都属于一组,当权限码>=long型左移的62位时,从开一个权限位,权限码从默认的1从新开始

例如:

0组权限:

        权限码:1      (权限码默认从1开始)

        权限码:2     1<<1(1左移一位)

        权限码:4     2<<1(2左移一位)

        权限码:8     4<<1(4左移一位)

        权限码:n     1<<60(1左移60位)

1组权限:

        权限码:1      (权限码默认从1开始)

        权限码:2     1<<1(1左移一位)

        权限码:4     2<<1(2左移一位)

        权限码:8     4<<1(4左移一位)

        权限码:n     1<<60(1左移60位)

2组权限:

        权限码:1      (权限码默认从1开始)

        权限码:2     1<<1(1左移一位)

        权限码:4     2<<1(2左移一位)

        权限码:8     4<<1(4左移一位)

        权限码:n     1<<60(1左移60位)

3组权限:

        权限码:1      (权限码默认从1开始)

        权限码:2     1<<1(1左移一位)

        权限码:4     2<<1(2左移一位)

        权限码:8     4<<1(4左移一位)

        权限码:n     1<<60(1左移60位)




1、权限值的设定
  用二进制来表示权限值应该是按位来设置,每个位占一个,表示一种权限,如:

    00000001表示十进制1,----> 1
    00000010表示十进制2,----> 1 << 1
    00000100表示十进制4,----> 2 << 1
    00001000表示十进制8;----> 4 << 1

  依次类推,才能清晰正确的标识,多种权限的赋予则使用“或运算”,此时各位比较混乱,如00000011表示十进制3,此时它意味着拥有两种权限。

Long userrolevalue ;//用户的权限值,根据他属于的权限组,这个值会不同
Long oprolevalue   ;//一个操作的权限值,根据他属于的权限组,这个值会不同

2、权限的赋予(或运算)
userrolevalue = userrolevalue | oprolevalue
假设一个用户u1,他的初始权限值为0(00000000)。如果要指定他有经理的权限,经理的权限值为4(00000100),在第三个二进制位为1。
很显然,userrolevalue =  0 | 4 ,值为4,如果u1要同时具有文员、主管、经理的权限呢,
userrolevalue = 0 | 1   00000000 | 00000001  = 00000001
userrolevalue = 1 | 2   00000001 | 00000010  = 00000011
userrolevalue = 3 | 4   00000011 | 00000100  = 00000111
这样,第1、2、3位都是1了,用 “或”的好处就是只改变指定位的值,如果用户已经有了该权限,直接简单的用加法来做会出错,而用"或"再赋予一次,也不会出错,如下:
userrolevalue = 7 | 4   00000111 | 00000100  = 00000111

3、权限的除去(求补、与运算)
userrolevalue = userrolevalue & (~oprolevalue)
假设一个用户u1,他的初始权限值为7(00000111),说明他能做文员、主管、经理权限组所能作的所有操作。如果不想让他有主管权限组能作的操作呢,那么,就要把他的权限值变为00000101,而主管权限组的权限值是00000010,显然简单的用减法,肯定也是不行的,但是先对00000010作补运算,可以得到11111101,再同00000111作与运算,就得到了00000101,这样就只对第二位作了改变,不会影响到其它位,我们的目的也就达到了。

对于一个操作,哪些权限组能操作它,也可以用与运算来做,不让某些权限组有些操作的权限,也可以先求补,再作与运算来解决。

4、权限的验证(与运算)
(userrolevalue & oprolevalue) != 0表示拥有oprolevalue所表示权限

 例如:现有一个用户User的权限为6(00000110),通过&(与)运算,使用公式 "(User的权限 & 权限值) != 0" 即可判断拥有某个权限值表示的权限----6 & 2 == 2 (00000110 & 00000010 == 00000010),表示User拥有主管权限;6 & 4 !=0 (00000110 & 00000100 == 00000100) ,表示User拥有经理权限;6 & 1 == 0(00000110 & 00000001 == 00000000),表示User无文员权限;

----------------参考资料-------------------------------------------》》





《《-----------------二进制权限控制示例--------------------》》

后面补上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值