1.后台每个路由定义一个菜单(包含操作(权限):列表,新增,编辑,删除,导出,审核。。。)
将其与二进制数一一相对:
{
1:'list',
2:'add',
4:'edit',
8:'delete',
16:'export',
32:'check',
}
给用户分配的权限即是 数字相加
例如: admin/user 管理员管理。
给一个用户分配 list和edit和export = 1 + 4 + 16 = 21
看一下二进制和十进制的转换
{
1: 0000 0001,
2: 0000 0010,
4: 0000 0100,
8: 0000 1000,
16:0001 0000,
32:0010 0000,
}
可以看出 每个权限可以用对应的数字1所在的位置来表示:即是 从右边最低位开始,第一位是list ,第二位是 add ...
21 = 2^4 + 2^2 + 2^0
所以 21 = 0001 0101 可以看出来 有 list edit 以及 export的权限
所以判断权限时: 举例
1.进制转换
21(10) = 0001 0101(2)
2. 例如判断 export 对应的 是 16 = 2^4 ,
将0001 0101(2)转换为数组 [0,0,0,1,0,1,0,1]
数组反转: [1,0,1,0,1,0,0,0]
找到数组下标为4的=1 则判断该用户有该权限
示例代码(十进制数可以直接简化为数组下标)
<?php
//{
//1:'list',
//2:'add',
//4:'edit',
//8:'delete',
//16:'export',
//32:'check',
//}
//{
//1: 0000 0001,
//2: 0000 0010,
//4: 0000 0100,
//8: 0000 1000,
//16:0001 0000,
//32:0010 0000,
//}
const PERMISSIONS =
[
'list' => 0,
'add' => 1,
'edit' => 2,
'delete' => 3,
'export' => 4,
];
$method = 'user/export';
$my_permission['user'] = 9;
$array = explode("/", $method);
$permission = end($array);
$bin = decbin($my_permission['user'] . "");
if(strlen($bin) < 8){
//前面补0
$zero_number = 8 - strlen($bin);
for ($i=0;$i<$zero_number;$i++){
$bin = '0'.$bin;
}
}
/*print_r($bin);
print_r('-----------');
print_r(strlen($bin)-PERMISSIONS[$permission]-1);
print_r('-----------');*/
//直接按字符串取下标
print_r(substr(($bin), strlen($bin)-PERMISSIONS[$permission]-1, 1));
?>