权限算法
权限算法
原理:
位与运算,顾名思义就是对位进行与运算:
以上面的式子为例: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;
}
?>