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

资源魔 33 0
本篇文章次要讲述了用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 Co妹妹onController
{
     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地点输出了没有属于他的权限的地点咱们会让他重定向到他本人的治理页面.

另有承继的Co妹妹onController 的内容;

<?php
namspace app\admin\controller;
use think\Controller;
use think\Request;
use app\admin\model\Co妹妹on as Controller
{
  public function __construct()
{
  parent::__construct();
  $res = new Co妹妹onModel();
  $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> ');
}

 $resCo妹妹on = $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 Co妹妹on 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;
        }

    }

}

下面的Co妹妹onModel 正在Co妹妹onController 中被挪用 , 来进行治理员权限等级的判别.

相干教程:PHP视频教程

以上就是用thinkphp5 完成基于脚色的拜访管制(rbac权限)的具体内容,更多请存眷资源魔其它相干文章!

标签: php开发教程 php开发资料 php开发自学 thinkphp5 rbac权限

抱歉,评论功能暂时关闭!