有。你没有留意我以前问过的问题。
当时唠叨给了详细的回答。采用并和或的方式来进行权限判断,可以使用几近无限的权限值。你看看ckong.cn吧。就是用的这个来判断的。

解决方案 »

  1.   

    君子兰)兄,似乎我没找到那篇文章,你保存了,能不能发给我,谢谢[email protected]
      

  2.   

    总共有操作0,1,2,3,4,5那么当用户有权限为 0,1,2,3,4时,那么他的purview=2^0+2^1+...+2^4=31现在要判断用户是否有权限5那么用 5(101)和31(11111)进行与则结果为5(101),说明用户有权限5,然而用户并没有权限5,这个是不是有问题?
      

  3.   

    根据以上思想,用php写了个权限判断的列子<?php
    //判断当前用户是否有操作权限
    function isPower($user_pValue, $curOpt)
    {
      if (pow(2,$curOpt) == ($user_pValue & pow(2,$curOpt)))
      {
        return true;
      }
      else
      {
        return false;
      }
    }
    //计算用户的权限值
    //参数$user_power形如0,1,2形式
    function userPowerValue($user_power)
    {
      $user_powerA=explode(",",$user_power);
      $user_pValue=0;
      foreach($user_powerA as $v)
      {
        $user_pValue+=pow(2,$v);
      }
      return $user_pValue;
    }//****************************************
    //权限判断$user_power="0,1,2,3,4,5"; //有权限0,1,2,3,4,5
    $userValue=userPowerValue($user_power); //计算用户权限总值$curOpt=33; //用户要进行的操作,判断是否有权限//判断一,输出无权
    if(isPower($userValue, $curOpt))
    {
    echo "有权";
    }
    else
    {
    echo "无权";
    }echo "<br>";//判断二,输出有权
    $curOpt=3;
    if(isPower($userValue, $curOpt))
    {
    echo "有权";
    }
    else
    {
    echo "无权";
    }
    ?>
      

  4.   

    假设一个请求:
    index.php?option=ss&task=jji&act=ii
    那么其对应的权限是
    $auth[option_ss__task_jji__act_ii]=1;
      

  5.   

    假设一个请求:
    index.php?option=ss&task=jji&act=ii
    那么其对应的权限是
    $auth[option_ss__task_jji__act_ii]=1;这个会不会有安全问题?明摆着让人知道了。
    每个权限的值必须是“2”的整数倍吧?
    如果要设置20个权限,该值立马攀升到5242882^30也不过10位数而已,不怕的。有时候具体问题具体分析吧。
    只是偶看到这种方法比较好呀。共享出来和大家讨论了。。哈哈。差点儿忘记了楼上共享出函数的同学,其实也都是比较简单的函数嘛。不错不错。。
      

  6.   

    我不喜欢bit位转来转去的,而且很明显位定义很麻烦,赋权也麻烦。还是我的方案好。
    php的数组实在是太棒了。
      

  7.   

    就我个人而言,也是喜欢直接以一定排列值存在数据库里,然后取出来选择也方便。
    然后比较权限直接用个SESSION数组就可以了。bit方法就是不知道一个数值后,要知道全部权限分布,还得一个一个的检测,就一点麻烦些。。其它倒也好
      

  8.   

    用与的方法控制权限很好用的!<?php
    define("AUTH_ADMINISTRATOR", 1);
    define("AUTH_SHOW", 2);
    define("AUTH_ADD", 4);
    define("AUTH_DELETE", 8);// 如果用户的权限为6 那么该用户是否有删的权限呢? --> 判断如下:if (AUTH_DELETE & 6)
    {
    exit(true);
    }
    else
    {
    exit(false);
    }
    ?>
      

  9.   

    对,就是稚鹰的做法。只不过把define改成了mysql就是了。
    对应着一个权限名称,一个权限id。id的值就是稚鹰这个里面的1、2、4、8
      

  10.   

    我还是喜欢将权限列一个表,相当于系统的每个对应的模块将模块对应一个数字,然后在管理员中分配这些模块的对应数字,如果有对应数字就说明有权限,反之亦然,具体实现起来可以将这些用数组看待,只要用in_array()作判断就可。
    看IPB论坛的后台可以得到一些启发。
      

  11.   

    这么简单的问题居然要使用幂运算?!mysql中有set类型,可存放64个标志位。
      

  12.   

    这么简单的问题居然要使用幂运算?!
    -----------------------set类型不是每种数据库都有的吧~
    而且"幂运算"的效率并不低 个人觉得基至比用set类型快~~~~~~
    因为都是与或运算`````
      

  13.   

    linjianwu(飞天狐狸) ( ) 信誉:98  2006-03-07 09:18:00  得分: 0  
     
     
       当时在论坛里也看过。用二进制控制用户登陆系统的权限例子。前段机子硬盘挂了。数据都掉了。 有谁知道能不能共享一下。
      
     
    ==============================我发的这个不算二进制吗?
      

  14.   

    我想了下这个问题,昨天在考虑一个有50个不同权限的系统时用这个肯定是不行了
    如果用户有1,2,3,4,5权限,假设当前要进行3权限的操作,我只用判断3是否在1,2,3,4,5这个数组里就行了,用in_array(),所以也就没有必要用2的n次方来解决啊,这样不是还增加的运算,导致效率低,直接用数组就行了啊?大家探讨下
      

  15.   

    to:zhiin(稚鹰@南通) 
    但是除了两数相与外还要进行2的n次方运算啊?这不需要时间吗?还有我的是50个权限,如果用数组来解决是不是最佳方法呢?