权限控制PHP

权限算法

权限算法

原理:
位与运算,顾名思义就是对位进行与运算:
以上面的式子为例: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;
设置多角色用户。根据权限值判断用户的角色。。。/

php权限算法
复制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 '无权限';
}

?>

-------------------------------------------------------------------------

权限算法

复制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种权限

权限判断的列子  
   
  <?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   "无权";  
  }  
  ?>

-------------------------------------------------------------------------
用户登录后把权限表读入到一个数组中,并把这个数组注册到SESSION中  
  $query="SELECT   perm_id   FROM   oper_perms   WHERE   oper_code=/"$op_code/"";  
  $result=ifx_query($query,$conn);  
  if($result)  
  {  
  $data_row=ifx_fetch_row($result,"FIRST");  
  while(is_array($data_row))  
  {  
  $perm_id=$data_row["perm_id"];  
  $perms[$perm_id]=1;  
  $data_row=ifx_fetch_row($result,"NEXT");  
  }  
  ifx_free_result($result);  
  }  
  session_register("perms");  
  在须检查权限的页面开头:  
  <?  
  session_start();  
  $check_perms=111;/*该页面的权限ID*/  
  if   ($_SESSION["op_code"]==""   ||   empty($_SESSION["op_code"]))  
  {  
  header("location:../errors/err_timeout.htm");  
  exit;  
  }  
  if   ($_SESSION["perms"][$perm_id]!=1)  
  {  
  header("location:../errors/err_forbid.htm");  
  exit;  
  }  
  ?>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值