• 技术文章 >后端开发 >php教程

    用thinkphp5 实现基于角色的访问控制(rbac权限)

    little bottlelittle bottle2019-04-22 16:14:50转载2761
    本篇文章主要讲述了用thinkphp5 实现基于角色的访问控制(rbac权限),分享给大家,方便有需要的朋友参考。

      先创建一个数据库;

    例如:创建一个test数据库;然后创建3个 表分别为:test_admin (管理员表), test_role,test_auth.

    这个是新创建的test库

    管理员表

    这个是新创建的admin表, 这个表是用户表是管理后台的用户。

    这个表的issuper这个字段代表是否是超级管理员 , 这个超级管理员可以管理全部的角色和执行所有的权限。

    admin_role_id 这个字段主要描述的是除了超级管理员之外的管理员所对应的角色表id 下面我们会给出角色表.

    角色表

    这个表是角色表,他的主id 和管理员的admin_role_id可以分出管理员都处于什么角色管理.

    权限表

    这个表是权限表,他的主id 所对应的是角色表的role_auth_id 可以得出不同的角色有着不同的权限可以执行.

      网站后台管理页面登陆不同的管理员对角色和角色权限的显示.

    在tinkphp的application的admin文件的model层创建Admin.php,Role.php,Auth.php进行业务处理.

    然后在controller层创建index.php

    <?php
    namespace app\admin\controller;
    use think\Controller;
    use think\Url;
    use think\Request;
    use think\Session;
    use app\admin\model\Auth as AuthModel
    use app\admin\model\Role as RoleModel
    
    class Index extends CommonController
    {
         public $role;
         public $auth;
         public $view;
    public funtion __construct()
    {
      $this->role = new RoleModel()
      $this->auth = new AuthModel()
      $this->view = new View();
    }   
    
      publci function auth()
    {
    //角色id;
      $admin_id = sesison('admin_id');
      $admin_name = session('admin_name');
    
      $resAdmin = $this->admin->where(['admin_id'=>$admin_id])->select();
      if($resAdmin[0]->issuper == 1){
    //超级管理员拥有全部权限;
    //一级权限;
      $authA = $this->auth->where(['auth_level']=>0)->select();
    //二级权限
      $authB = $this->auth->where(['auth_level'=>1])->select();
    } else {
      //权限ids;
      $role_auth_ids = $this->role->where(['role_id'=>$admin_role_id])->select();
      $authA = $this->auth->where('auth_level' , 0)->where('auth_id' , 'in' , $role_auth_ids)->select();
      $authB  = $this->auth->where('auth_level' , 1])->where('auth_id' , 'in' , $role_auth_ids)->select();
    }
    
      $auth = array('authA'=>$authA , 'authB'=>$authB);
      $this->redirect('admin/'.$auth['authA'][0]->auth_c.'/'.$auth['authA'][0]->auth_a);
    
    }
    
    public function leftnav()
    {
      $admin_id = session('admin_id');
      $amin_name = session('admin_name');
      //角色id;
      $resAdmin = $this->admin->where(['admin_id']=>$admin_id)->select();
      $admin_role_id = $resAdmin[0]->$admin_role_id;
      if($resAdmin[0]->issuper == 1){
      //超级管理员super拥有全部权限;
     //一级权限;
      $authA = $this->auth->where(['auth_level'=>0])->select();
     //二级权限;
      $authB = $this->auth->where(['auth_level'=>1])->select();
    }  else {
      //权限ids
      $role_auth_ids = $this->role->where(['role_id'=>$admin_role_id])->select();
      $role_auth_ids = $role_auth_ids[0]->role_auth_ids;
    
      $authA = $this->auth->where('auth_level' , 0)->where('auth_id' , 'in' , $role_auth_ids)->select();
      $authB = $this->auth->where('auth_level' , 1)->where('auth_id' , 'in' , $role_aut_ids)->select();
    }
    
      $auth = array('authA'=>$authA , 'authB'=>$authB);
      $this->view->assign('authA' , $auth['authA']);
      $this->view->assign('authB' , $auth['authB']);
    }
    
        
    }

    现在我来解释一下上面auth方法的作用是用来重定向的如果登陆的管理者向url地址输入了不属于他的权限的地址我们会让他重定向到他自己的管理页面.

    还有继承的CommonController 的内容;

    <?php
    namspace app\admin\controller;
    use think\Controller;
    use think\Request;
    use app\admin\model\Common as Controller
    {
      public function __construct()
    {
      parent::__construct();
      $res = new CommonModel();
      $resquest = Request::instance();
    
      if(session('admin_id') == null){
      if(strtolower($resquest->controller()) == 'index' && strtolower($resquest->action()) == 'login'){
      return true;
    } else {
     $this->error('没有登陆!<br /><span style="color:gray;">...</span> ');
    }
    
     $resCommon = $res->auth();
     if(Request::instance()->isAjax()){
      $this->ajaxReturn(['msg'=>'没有操作权限!' , 'code'=>'201'] , 'json');
    } else {
     $this->error('没有操作权限!<br><span style="color:gray;">...</span>');
    }
    }
    }
    }

      权限控制

    管理员登陆后台 访问属于自己权限的操作业务 , 如果管理员想要越级查看不属于自己权限的业务 , 控制器 会让管理员重定向到自己的操作页面.

    <?php
    namespace app\admin\model;
    use think\Model;
    use think\Db;
    use think\Session;
    use think\Request;
    use app\admin\model\Admin as AdminModel;
    use app\admin\model\Role as RoleModel;
    use app\admin\model\Auth as AuthModel;
    
    class Common extends Model
    {
    
        public function auth()
        {
            //当前控制器和操作方法;
            $request= Request::instance();
            $auth_ac = strtolower(trim($request->controller())).'/'.strtolower(trim($request->action()));
            //var_dump($auth_ac);
            $auth = array();
            $res = new AdminModel();
            $resRole = new RoleModel();
            $resAuth = new AuthModel();
            
            $resAdmin = $res->where(['admin_id'=>session('admin_id')])->select();
            //非超级管理员控制权限;
            if($resAdmin[0]->issuper != 1){
                $admin_role_id = $resAdmin[0]->admin_role_id;
                //$admin_role_id = $info['admin_role_id'];
                //$info = $this->info('Role' , ['role_id'=>$admin_role_id] , 'role_auth_ids');
                $info = $resRole->where('role_id' , $admin_role_id)->select();
                $role_auth_ids = $info[0]->role_auth_ids;
                $infos = $resAuth->where('auth_id' , 'in' , $role_auth_ids)->select();
                //$infos = $this->infos('Auth' , ['auth_id'=>['in' , $role_auth_ids] , 'auth_level'=>1] ,'auth_c , auth_a' );
                foreach($infos as $key=>$val){
                    $auth[] = $val['auth_c'].'/'.$val['auth_a'];
                } 
    
                $result = array_merge($auth , ['index/auth'] , ['index/login']);
                //var_dump($result);
                if(in_array($auth_ac , $result)){
                    return true;
                } else {
                    return false;
                } 
    
            } else {
                return true;
            }
    
        }
    
    }

    上面的CommonModel 在CommonController 中被调用 , 来进行管理员权限等级的判断.

    相关教程:PHP视频教程

    以上就是用thinkphp5 实现基于角色的访问控制(rbac权限)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:博客园,如有侵犯,请联系admin@php.cn删除
    专题推荐:thinkphp5 rbac权限
    上一篇:解决thinkphp使用paginate分页时的问题 下一篇:PHP精确到毫秒的秒杀倒计时范例
    大前端线上培训班

    相关文章推荐

    • PHP的RBAC权限详解• 使用Yii2 rbac权限控制菜单menu• 关于Yii2搭建后台并实现rbac权限控制• ThinkPHP中RBAC权限带菜单栏显示和详细权限操作

    全部评论我要评论

  • 叶凯

    厉害,这下学习了

    2020-06-09

  • 取消发布评论发送
  • 1/1

    PHP中文网