思路:
在一个构造函数中 public function __construct(){}
1:获取用户id
2:根据用户id找角色 (角色表和用户角色表联查找用户拥有的所有角色的id)
3:拼接角色id
4:根据角色找权限 (权限表和角色权限表联查 查找到用户拥有角色的权限)
5:循环拼接控制器和方法
6:获取当前的控制器方法 (request()->controller().'/'.request()->action())
7:判断是否存在 (不存在 false “该用户没有此访问的权限”)
这段代码是判断是否有访问控制器的权限
<?php
namespace app\admin\controller;
use think\Controller;
use think\Db;
use think\Session;
use think\Cookie;
use think\Request;
class Common extends Controller
{
public function __construct()
{
parent::__construct();
$session = Session::get("admin");
if(empty($session)||!isset($session))
{
$this->error('没有登录',"admin/login/login");
}
//获取用户id
$id=$session['username']['uid'];
//根据用户id查出用户对应的角色id
$res=Db::table('u_r')->field('r_id')->where('u_id',"$id")->select();
//通过循环,将查询出来的角色id拼成字符串 例如1,2,3
$r_id='';
foreach($res as $v)
{
$r_id.=','.$v['r_id'];
}
//将用户对应的角色拼接成数组的形式
$r_id=substr($r_id,1);
//通过角色id查找角色权限关系表 查出权限
$data=Db::table('node')->join('r_n','nodeId=n_id')->whereIn('r_id',"$r_id")->select();
//拼接权限
$power=[];
foreach($data as $v)
{
if(!in_array($v['controller'],$power))//判断控制器是否存在
{
$power[]=$v['controller'];
}
}
$con=request()->controller();//当前访问的控制器
//request()->action 当前访问的方法
if(!in_array($con,$power) && $con!=='Index')
{
$this->error('该用户没有访问权限');
}
}
}
图片中的代码是判断是否有访问控制器/方法的权限