小編給大家分享一下用thinkphp5如何實(shí)現(xiàn)基于角色的訪問控制,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)公司從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元泰安做網(wǎng)站,已為上家服務(wù),為泰安各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575一
先創(chuàng)建一個(gè)數(shù)據(jù)庫;
例如:創(chuàng)建一個(gè)test數(shù)據(jù)庫;然后創(chuàng)建3個(gè) 表分別為:test_admin (管理員表), test_role,test_auth.
這個(gè)是新創(chuàng)建的test庫
管理員表
這個(gè)是新創(chuàng)建的admin表, 這個(gè)表是用戶表是管理后臺(tái)的用戶。
這個(gè)表的issuper這個(gè)字段代表是否是超級(jí)管理員 , 這個(gè)超級(jí)管理員可以管理全部的角色和執(zhí)行所有的權(quán)限。
admin_role_id 這個(gè)字段主要描述的是除了超級(jí)管理員之外的管理員所對(duì)應(yīng)的角色表id 下面我們會(huì)給出角色表.
角色表
這個(gè)表是角色表,他的主id 和管理員的admin_role_id可以分出管理員都處于什么角色管理.
權(quán)限表
這個(gè)表是權(quán)限表,他的主id 所對(duì)應(yīng)的是角色表的role_auth_id 可以得出不同的角色有著不同的權(quán)限可以執(zhí)行.
二
網(wǎng)站后臺(tái)管理頁面登陸不同的管理員對(duì)角色和角色權(quán)限的顯示.
在tinkphp的application的admin文件的model層創(chuàng)建Admin.php,Role.php,Auth.php進(jìn)行業(yè)務(wù)處理.
然后在controller層創(chuàng)建index.php
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){ //超級(jí)管理員擁有全部權(quán)限; //一級(jí)權(quán)限; $authA = $this->auth->where(['auth_level']=>0)->select(); //二級(jí)權(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){ //超級(jí)管理員super擁有全部權(quán)限; //一級(jí)權(quán)限; $authA = $this->auth->where(['auth_level'=>0])->select(); //二級(jí)權(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)限的地址我們會(huì)讓他重定向到他自己的管理頁面.
還有繼承的CommonController 的內(nèi)容;
controller()) == 'index' && strtolower($resquest->action()) == 'login'){ return true; } else { $this->error('沒有登陸!
... '); } $resCommon = $res->auth(); if(Request::instance()->isAjax()){ $this->ajaxReturn(['msg'=>'沒有操作權(quán)限!' , 'code'=>'201'] , 'json'); } else { $this->error('沒有操作權(quán)限!
...'); } } } }
三
權(quán)限控制
管理員登陸后臺(tái) 訪問屬于自己權(quán)限的操作業(yè)務(wù) , 如果管理員想要越級(jí)查看不屬于自己權(quán)限的業(yè)務(wù) , 控制器 會(huì)讓管理員重定向到自己的操作頁面.
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(); //非超級(jí)管理員控制權(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)用 , 來進(jìn)行管理員權(quán)限等級(jí)的判斷.
以上是用thinkphp5如何實(shí)現(xiàn)基于角色的訪問控制的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。