PHP 权限管理 位运算

2018-06-30  本文已影响0人  墨入烟松

最近在搞一个权限管理,就是通过位或运算来验证权限,来分享一下实现原理。


权限管理,核心就是权限分配权限验证两点。

权限分配

用过linux系统的同学们应该都清楚,linux中文件的权限是怎么分配的。
我们为一个文件赋了755的权限,这个7(4+2+1)的权限是有rwx三个组成。

权限名 含义 代表数字
r 可读 4
w 可写 2
x 可执行 1

同样,我们的权限分配也可以采取这种方式去做,假设我们也有一些权限需要分配

权限名 含义 代表数字
index 展示数据 1
add 新增数据 2
edit 修改数据 4
del 删除数据 8

我们现在需要给用户分配权限,与上面linux的权限分配方式相同

用户名 权限 含义
张三 1 只有 index 权限
李四 3 (1+2)index+add 权限
王五 7 (1+2+4)index+add+edit 权限
赵六 11 (1+2+8)index+add+del 权限

这样,我们的权限基本分配完毕。

权限验证

位运算

权限验证的核心点就是位或运算,也就是‘丨’这个运算符,先把PHP官网位运算符解释贴出来。

例子 名称 说明
a &b And(按位与) 将把 a 和b 中都为 1 的位设为 1。
a 丨b Or(按位或) 将把 a 和b 中任一为 1 的位设为 1。
a ^b Xor(按位异或) 将把 a 和b 中一个为 1 另一个为 0 的位设为 1。
~ $a Not(按位取反) 将 $a 中为 0 的位设为 1,反之亦然。
a <<b Shift left(左移) a 中的位向左移动b 次(每一次移动都表示“乘以 2”)。
a >>b Shift right(右移) a 中的位向右移动b 次(每一次移动都表示“除以 2”)。

下面就开始权限验证的代码

模拟一下场景:

    <?php
        //1、用户张三去新增数据
        //拿张三的权限 和 当前操作权限 做位或运算 如果结果等于张三的权限 就说明有该权限 否则没有
        // 1|2的结果为3
        if((1|2) != 1){
            return '权限不足';
        }
        
        //2、用户赵六去修改数据 
        // 11|8 = 11
        if((11|8) != 11){
            return '权限不足';
        }
        
        /**
         * 位或运算 原理:是二进制运算规则  两边 位都为1的设为1
         * 拿上面两个举例来说:
         * 1的二进制: 00001(就写五位吧)
         * 2的二进制: 00010
         * 这里涉及到二进制的运算 按照运算规则  结果为 00011 换算10进制结果为 3 不等于1 说明没有权限
         * 11的二进制 01011
         * 8的二进制  01000
         * 同理结果是 01011 换算十进制结果为 11 等于11 说明有权限 
         *
        */
  
上一篇 下一篇

猜你喜欢

热点阅读