1,什么是二进制?
二进制是用0和1两个数码来表示的数,他的规则是“逢二进一”
比如:二进制00000000表示十进制0,00000001表示十进制1
2,如何使用权限控制?
二进制权限控制说的简单点,即是二进制与十进制之间的转换
用二进制表示权限值是按位来设置的,即每个位占一个权限,
比如:00000001表示第一位拥有一种权限(转为十进制权限为:1)
00000011表示第一位,第二位各拥有一种权限(转为十进制权限为3)
再比如:某个人拥有老师,班主任,教务主任3种权限,我们可以用二进制表示为:
00000111,用十进制表示为7
3,一个接口权限控制的例子。
要求:通过二进制权限控制不同来源的客户端(如:平板,手机,网页)登录的用户可以访问指定应用。
说明:目前有3个数据源(平板,手机,网页),他们对应的二进制权限位分别为 1, 2, 3
有一个用户user,他有属性:id,name,sex,power
一般接口会为每个数据源分配一个appKey,设置平板为appKey1,手机appKey2,网页appKey3。
假设我们设置用户user,可以通过平板和网页访问,即用二进制表示为00000101,用十进制表示:power = 5
程序实现:
使用binaryPosList 表示“二进制权限位集合”
for(int i=0;i<binaryPosList.size;i++) { power += pow(2,binaryPosList[i]-1); } private static int pow(int a, int N) { if(N == 0) { return 1; } else { return a*pow(a,N-1); } }
所以power = pow(2,1-1) + pow(2,3-1) = 5;
当用户使用手机登录时:
接口通过传过来的appKey 查找到对应的二进制位为2,同时我们查找出此用户的权限power为5,二进制位00000101
首先说明下,当二进制最后一位为0时,转换为十进制必为偶数,当二进制最后一位为1时,转换为十进制必为奇数。
所以可以将power需要对比的位数移动到末尾,即将二进制数向右移动(二进制位-1),即移动后为:00000010,末尾移动的数丢弃,首位移动后用0补充。Java中正好有移位的算法。
Int n = power >>> (二进制位 -1)
若n为偶数(n % 2 == 0)则表示没有权限,若n为奇数则表示有权限。