+ -
当前位置:首页 → 问答吧 → PHP利用二进制实现权限控制,遇到一个瓶颈,求解决方案。

PHP利用二进制实现权限控制,遇到一个瓶颈,求解决方案。

时间:2011-12-18

来源:互联网

原理:
1、对N(权限的ID)进行2的N次方,然后相加,即为所有权限。
2、对N(当前权限的ID)进行2的N次方,然后和所有权限进行与运算。如果结果和当前权限的值相等那么就代表有权限,否则代表没权限。


Rank表结构和数据
ID Url
1 1.php
2 2.php
3 3.php
4 4.php
5 5.php


假如对2, 3, 4有权限,那么4 + 8 + 16 = 28(2的2次方+2的3次方+2的4次方)


对2有权限,与结果等于2^2
11100 28 = 2^2 + 2^3 + 2^4
00100 4 = 2^2
00100


对3有权限,与结果等于2^3
11100 28 = 2^2 + 2^3 + 2^4
01000 8 = 2^3
01000


对4有权限,与结果等于2^4
11100 28 = 2^2 + 2^3 + 2^4
10000 16 = 2^4
10000


对1没有权限,与结果等于0
11100 28 = 2^2 + 2^3 + 2^4
00010 2 = 2^1
00000
对5没有权限,与结果等于0
011100 28 = 2^2 + 2^3 + 2^4
100000 32 = 2^5
000000




下面是我用PHP写的一个函数,用来判断当前用户是否拥有当前的权限PHP code
<?php
    //拥有的权限的ID分别是:2, 3, 4
    //2^2 + 2^3 + 2^4 = 4 + 8 + 16 = 28
    check_rank(28, 5);
    
    /**
    $num_all:进行2的N(权限ID)次方之后的所有权限的总和
    $num_current:当前权限的ID
    */
    function check_rank($num_all, $num_current)
    {
        $num_current = pow(2, $num_current);
        $num_result = $num_all & $num_current;
        $result = $num_result == $num_current ? "true" : "false";
        echo $result;
    }
?>




现在我遇到一个问题,就是我可能会有成千上万的权限,在这种情况下如果进行2的1000次方或2的10000次方。PHP就会计算不出来。请问怎么处理这种情况,或者是否还有其它的设计思路?谢谢。

作者: subendong   发布时间: 2011-12-18

等待热心人回复。。。

作者: subendong   发布时间: 2011-12-19

求解决方案

作者: subendong   发布时间: 2011-12-19

参考linux下的文件(目录)权限设置
777 = 1+2+4 1+2+4 1+2+4
用位运算不是很快很好吗啊?

作者: sdsuper   发布时间: 2011-12-19