用thinkphp5如何實現(xiàn)基于角色的訪問控制

小編給大家分享一下用thinkphp5如何實現(xiàn)基于角色的訪問控制,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設計、成都網(wǎng)站制作與策劃設計,酉陽土家族苗族網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設十多年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:酉陽土家族苗族等地區(qū)。酉陽土家族苗族做網(wǎng)站價格咨詢:028-86922220

 先創(chuàng)建一個數(shù)據(jù)庫;

例如:創(chuàng)建一個test數(shù)據(jù)庫;然后創(chuàng)建3個 表分別為:test_admin (管理員表), test_role,test_auth.

用thinkphp5如何實現(xiàn)基于角色的訪問控制

這個是新創(chuàng)建的test庫

用thinkphp5如何實現(xiàn)基于角色的訪問控制

管理員表

這個是新創(chuàng)建的admin表, 這個表是用戶表是管理后臺的用戶。

這個表的issuper這個字段代表是否是超級管理員 , 這個超級管理員可以管理全部的角色和執(zhí)行所有的權(quán)限。

admin_role_id 這個字段主要描述的是除了超級管理員之外的管理員所對應的角色表id 下面我們會給出角色表.

用thinkphp5如何實現(xiàn)基于角色的訪問控制

角色表

這個表是角色表,他的主id 和管理員的admin_role_id可以分出管理員都處于什么角色管理.

用thinkphp5如何實現(xiàn)基于角色的訪問控制

權(quán)限表

這個表是權(quán)限表,他的主id 所對應的是角色表的role_auth_id 可以得出不同的角色有著不同的權(quán)限可以執(zhí)行.

 網(wǎng)站后臺管理頁面登陸不同的管理員對角色和角色權(quán)限的顯示.

在tinkphp的application的admin文件的model層創(chuàng)建Admin.php,Role.php,Auth.php進行業(yè)務處理.

然后在controller層創(chuàng)建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){
//超級管理員擁有全部權(quán)限;
//一級權(quán)限;
  $authA = $this->auth->where(['auth_level']=>0)->select();
//二級權(quán)限
  $authB = $this->auth->where(['auth_level'=>1])->select();
} else {
  //權(quán)限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擁有全部權(quán)限;
 //一級權(quán)限;
  $authA = $this->auth->where(['auth_level'=>0])->select();
 //二級權(quán)限;
  $authB = $this->auth->where(['auth_level'=>1])->select();
}  else {
  //權(quán)限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']);
}

    
}

現(xiàn)在我來解釋一下上面auth方法的作用是用來重定向的如果登陸的管理者向url地址輸入了不屬于他的權(quán)限的地址我們會讓他重定向到他自己的管理頁面.

還有繼承的CommonController 的內(nèi)容;

<?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'=>'沒有操作權(quán)限!' , 'code'=>'201'] , 'json');
} else {
 $this->error('沒有操作權(quán)限!<br><span style="color:gray;">...</span>');
}
}
}
}

  權(quán)限控制

   管理員登陸后臺 訪問屬于自己權(quán)限的操作業(yè)務 , 如果管理員想要越級查看不屬于自己權(quán)限的業(yè)務 , 控制器 會讓管理員重定向到自己的操作頁面.

<?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();
        //非超級管理員控制權(quán)限;
        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 中被調(diào)用 , 來進行管理員權(quán)限等級的判斷.

以上是用thinkphp5如何實現(xiàn)基于角色的訪問控制的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)站題目:用thinkphp5如何實現(xiàn)基于角色的訪問控制
URL標題:http://muchs.cn/article34/ighcpe.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設、標簽優(yōu)化、、域名注冊、軟件開發(fā)、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設