thinkphp5 rbac許可權
阿新 • • 發佈:2018-12-09
thinkphp 5 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; usethink\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 中被呼叫 , 來進行管理員許可權等級的判斷.