权限管理【等比权值法】
忙着写ERP系统,对权限管理有了点新的感悟。之前使用linux系统的时候,linux的权限控制使用的就是:
r(读权限)==1;
w(写权限)==2;
x(执行权限)==4;
拥有三种权限就是7(4+3+1),rw就是3(2+1)。
这样的方式对权限管理倒是不错,我也试着写了等比权值的权限管理。
权限表:
一个用户可以拥有所有的这些权限,如超级用户,那么他的权值就是30(16+8+4+2):
这个方法的关键就是,一个可以将用户的权限值解析成权限的集合的算法。因为使用的等比为2的数列,实现起来倒不是很困难。我用PHP和python实现了:
PHP:
1 function readPower($num,$list=array()){ 2 //判断是否为2的几次幂 3 if(($num & $num-1) == 0){ 4 $list[]=$num; 5 return $list; 6 } 7 8 //求小于权限值最大的权值数 9 $i=$num/2; 10 while ($i<$num){ 11 $i++; 12 if(($i & $i-1) == 0){ 13 $list[]=$i; 14 return readPower($num-$i,$list); 15 } 16 17 }
Python:
1 def qj(num,list=[]): 2 3 if(num & num-1) == 0: 4 list.append(num) 5 return list 6 7 i=num/2 8 while i<num : 9 i=i+1 10 if((i & i-1) == 0): 11 list.append(i) 12 return qj(num-i,list) 13 14
其他语言的实现也是同理。这里的一个关键就是,利用了二进制的特性。($num & $num-1) == 0可以判断一个数是不是2的几次方数。说个小例子就很好明白:
8的二进制是1000;
7的二进制是0111;
8和7按位与的结果就是0。而,所有的2的几次方数,都是1个1后边跟一堆0。很好就可以判断一个数是不是2的几次方数。
(算法如果有改进的建议,请给我留言!)
总结:
关于角色控制权限这一块,也很好使用。完全可以让一个角色拥有一个权限值,表示他拥有的权限集合。比如,我做的ERP系统中就有普通用户角色,他的权限只有订单管理和商品管理的权限,所以按照我的例子,权限值就是6。
我也是偶然想到这个办法控制权限,如果有什么不妥之处,请指正。