权限管理【等比权值法】

忙着写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。

我也是偶然想到这个办法控制权限,如果有什么不妥之处,请指正。

 

posted @ 2014-04-28 15:41  程序猿小叶  阅读(821)  评论(0编辑  收藏  举报