zoukankan      html  css  js  c++  java
  • 权限管理【等比权值法】

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

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

  • 相关阅读:
    对于Spring使用注解的一点总结
    2014-01-12
    Struts2补充a
    2014从Struts2开始
    总结:XHTML中链接CSS的四种方法(笔记)
    XHTML
    我Web前端开发的开端
    踏上前端路
    调取手机相册和拍照功能js
    mac常用系统指令和终端指令总结
  • 原文地址:https://www.cnblogs.com/chengxuyuanxiaoye/p/3696503.html
Copyright © 2011-2022 走看看