后台账号权限功能实现思路

每个后台用户都对应几个表:用户信息表,角色表,角色权限表,后台左侧目录节点表

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;
    }

 

posted @ 2019-01-25 12:01  御世制人  阅读(832)  评论(0编辑  收藏  举报