权限管理

权限管理是各种管理系统、网站等都会用到的功能。最近学到了一种赋权的方法,了解了一些赋权的原理,现在想把它分享出来,一边让更多的人可以了解到,一边加深自己的印象。

赋权操作一般不让用户与权限直接交互,而是通过中间的角色进行关联,这样可以避免赋权的难度。(比如权限有成百上千条,这样将每个权限赋给各个用户,工作量非常大,而角色不会有太多,角色拥有的权限不只一条,这样可以将属于这个角色的权限一次性赋给角色,再通过将角色赋给用户,实现为用户赋权)

权限管理在操作上,就是用户有没有点击某个链接去看对应内容的权限,因此将权限赋给各个链接的 url 。

现在介绍一种赋权方法(据说 jdk 就是根据这种赋权思想,来判断 public、protected、private 等可见性的)

这里引入权限位与权限码,权限码就是用一个 long 型数据,它的二进制有64位,采用每次将二进制中1左移一位来作为一个权限码,但这样至多只能左移62位,也就只能赋权 62 个,可能远远不够用,所以又引入权限位的概念,权限位就是用来将权限码分组的,这样每组就有63个权限码,又可以有无数组,所以可以赋权无数个。所以将权限设置为一个 long 型数组,数组下标就是权限位,数组值就是某个角色拥有的权限码的二进制或运算后的和。如下图所示:

权限位 权限码
RightPos RightCode
0 0001   (1)
1 0010   (2)
2 0100   (4)
3 1000   (8)
...... 1 << 60 (long 型有 8 * 8 = 64 位)

举个例子:比如项目经理拥有0号权限位中的1、2权限码,拥有1号权限位中4、8权限码,现在将项目经理这个角色赋给用户小A,则小A拥有的权限为 right[0] = 0001|0010 = 0011,right[1] = 0100|1000 = 1100,现在要判断小A是否有0号权限位中的0100权限,只需将0100 与 right[0] 进行&运算,如果结果为0,则小A没有0号权限中的0100权限,否则就有这项权限。

以上就是我学到的方法,如有不正确的地方,请多指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值