php登录权限控制,权限控制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种权限

权限判断的列子

//判断当前用户是否有操作权限

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   "
";

//判断二,输出有权

$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;     }     ?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值