最近在搞一个权限管理,就是通过位或运算来验证权限,来分享一下实现原理。
权限管理,核心就是权限分配和权限验证两点。
权限分配
用过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 说明有权限
*
*/
网友评论