Monthly Archives: 九月 2015

使用二进制进行权限控制

1,什么是二进制?

二进制是用01两个数码来表示的数,他的规则是“逢二进一”

比如:二进制00000000表示十进制000000001表示十进制1

2,如何使用权限控制?

二进制权限控制说的简单点,即是二进制与十进制之间的转换

用二进制表示权限值是按位来设置的,即每个位占一个权限,

比如:00000001表示第一位拥有一种权限(转为十进制权限为:1

00000011表示第一位,第二位各拥有一种权限(转为十进制权限为3

再比如:某个人拥有老师,班主任,教务主任3种权限,我们可以用二进制表示为:

00000111,用十进制表示为7

3,一个接口权限控制的例子。

要求:通过二进制权限控制不同来源的客户端(如:平板,手机,网页)登录的用户可以访问指定应用。

说明:目前有3个数据源(平板,手机,网页),他们对应的二进制权限位分别为 1, 2, 3

有一个用户user,他有属性:idnamesexpower

一般接口会为每个数据源分配一个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,同时我们查找出此用户的权限power5,二进制位00000101

首先说明下,当二进制最后一位为0时,转换为十进制必为偶数,当二进制最后一位为1时,转换为十进制必为奇数。

所以可以将power需要对比的位数移动到末尾,即将二进制数向右移动(二进制位-1),即移动后为:00000010,末尾移动的数丢弃,首位移动后用0补充。Java中正好有移位的算法。

Int n = power >>> (二进制位 -1)

n为偶数(n % 2 == 0)则表示没有权限,若n为奇数则表示有权限。