+ -
当前位置:首页 → 问答吧 → 权限算法

权限算法

时间:2008-07-02

来源:互联网

复制PHP内容到剪贴板
PHP代码:

<?
//权限id:删除=0;添加=1;修改=2;查看=3;移动=4;
$user1 = pow(2,0)+pow(2,3); //只有删除、查看权限
$user2 = pow(2,4);   //只有移动权限
//echo $user1;
$p = pow(2,4);    //判断移动权限 4
if($p&$user2)    //如果大于0有权限,否则没有权限
{
echo '有权限';
}
else
{
echo '无权限';
}

?>

此程序有点就是快

[ 本帖最后由 wz_910 于 2008-7-1 17:47 编辑 ]

作者: wz_910   发布时间: 2008-07-01

1 << 0 | 1 << 3 ?
1 << 4?

作者: ShiningRay   发布时间: 2008-07-01

原理:
位与运算,顾名思义就是对位进行与运算:
以上面的式子为例:purview & 2^3 也就是 28&8
将它们化成二进制有
 11100
& 01000
-------------------
  01000 == 8(十进制) == 2^3
同理,如果要验证是否有删除A---0的权限
可以用:purview &((int)Math.pow(2,0));
即:
 11100
& 00001
------------------------
  00000 == 0(十进制)  != 2^0

这种算法的一个优点是速度快。可以同时处理N个权限
如果想验证是否同时有删除A---0和删除B---3的权限
可以用purview&(2^0+2^3)==(2^0+2^3)?true:false;
设置多角色用户。根据权限值判断用户的角色。。。

作者: wz_910   发布时间: 2008-07-03

几点注意事项:首先,一个系统可能有很多的操作,因此,请建立数据字典,以便查阅,修改时使用。其次,如果用数据库储存用户权限,请注意数值的有效范围。操作权限值请用唯一的整数!

作者: wz_910   发布时间: 2008-07-03

复制PHP内容到剪贴板
PHP代码:
define('PATTERN_MODE_INT',                1);
define('PATTERN_MODE_STRING',        2);

function bitToArray($data, $ruleArr, $mode = PATTERN_MODE_INT)
{
        $varData = array();

        if($mode == PATTERN_MODE_INT)
        {
                $usedBit = 0;
                
                for($i = 0; $i < Count($ruleArr); $i++)
                {
                        if($ruleArr[$i] <= 0 ) continue;
                        $turnData = pow(2, $ruleArr[$i]) - 1 << $usedBit & $data;
                        $varData[$i] = $turnData >> $usedBit;

                        $usedBit += $ruleArr[$i];
                }
        }
        else
        {
                for($i = 0, $cnt = Count($ruleArr); $i < $cnt; $i++)
                {
                        $varData[$i] = substr($data, $i, $ruleArr[$i]);
                }
        }

        return $varData;
}

function arrayToBit($data, $ruleArr, $mode = PATTERN_MODE_INT)
{
        $rslt = '';

        if($mode == PATTERN_MODE_INT)
        {
                $usedBit        = 0;
                $rslt                = 0;
                
                for($i = 0; $i < Count($ruleArr); $i++)
                {
                        if($ruleArr[$i] <= 0 ) continue;

                        if(!$data[$i]) $data[$i] = 0;

            $rslt |= $data[$i] << $usedBit;

                        $usedBit += $ruleArr[$i];
                }
        }
        else
        {
                for($i = 0, $cnt = Count($ruleArr); $i < $cnt; $i++)
                {
                        $rslt .= sprintf('%0' . $ruleArr[$i] . 's', $data[$i]);
                }
        }
        
        return $rslt;
}

$data 部分为数据, $ruleArr为规则
如: 11011 调用 bitToArray('11011', array(1,1,1,1,1))
结果:
           array(
                       0  => 1
                       1 => 1,
                      2  => 0,
                      ........

反向用 arrayToBit 用来保存到存储器或数据库中.

对几位代表什么可定义常量:
如:
    define(PRIV_ADD_USER, 0) //第一位
    define(PRIV_DEL_USER, 1) //第二位

设 $p = bitToArray($result[$field], $rule);
那可以判定:

if($p[PRIV_ADD_USER])
{
   //有权限;
}
else
{
  //无权限
}

上面两个函数可以支持 整形, 字符形两种模式.

如 11011 用整形,结果就是 27, 数据库中值为27, 用字符形保存到数据库中就是 "11011"
整形使用位运算, 速度快, 但只支持 32种权限
字符形只受字符长度限制, 速度略慢于整形.

作者: 帅的像人渣   发布时间: 2008-07-03

热门下载

更多