后台账号权限功能实现思路
每个后台用户都对应几个表:用户信息表,角色表,角色权限表,后台左侧目录节点表
1:后台栏目都通过节点放入数据库(如下图)
2:每个控制器都继承一个基类,基类中在构造函数中,获取session中本登录后台用户的角色id,通过这个id进行查询缓存中本用户的角色是有哪些权限
这样用户在使用后台的方法时,会自动验证该用户有没有权限使用该方法
class Admin extends controller admin是基类 { public function _initialize() { parent:: _initialize(); //权限验证开始 //登陆验证 if(empty(session("user.name"))){ name是用户名,用于前台显示 $this->redirect(url("/store_login")); }else{ if(session("user.role_id")!=1){//非超级管理员 role.id是角色id,说明本用户属于超级管理员还是普通管理员 $authC=new extend\auth(); if($authC->operation()==0){ $this->error("没有权限!",'/admin/Index/welcome'); 通过下面的auth类的方法来判断本后台账户使用的当前控制器方法有没有权限 } } } }
auto类代码
class auth{ private $RoleId; public function __construct() { $this->RoleId=session("user.role_id"); } //动态权限操作 public function operation(){ $status=0; $request=\think\Request::instance(); $namef=$request->controller();//当前的控制器,自动获取 $name=$request->action();// 当前的方法 if($namef=='Login'||$namef=='Index'){ $status=1; }else{ $nodes=json_decode($this->GetMenuCache("ListThress_CN",3,0),true); // 所有该后台账户的权限节点,可通过数据库查节点表,此处是存入到缓存中 if(in_array(strtolower($namef.'/'.$name),$nodes)){ 判断当前使用的控制器方法,是否在权限数组中 $status=1 ; } } return $status; }