thinkPHP框架RBAC實(shí)現(xiàn)原理分析
本文實(shí)例講述了thinkPHP框架RBAC實(shí)現(xiàn)原理。分享給大家供大家參考,具體如下:
RBAC就是:Role Based Access Controller,基于角色(role)的權(quán)限(Access)管理,這里簡(jiǎn)單介紹一下他的原理與實(shí)現(xiàn)方式之一。
Part 1 數(shù)據(jù)庫(kù)設(shè)計(jì)
首先最基本的組成有:用戶(hù)(admin),角色(role),具體權(quán)限(auth),這三者之間的關(guān)系是這樣的:一個(gè)用戶(hù)只擁有一種角色,一種角色下?lián)碛卸鄠€(gè)權(quán)限,一個(gè)權(quán)限也會(huì)同時(shí)被多個(gè)角色擁有,也就是說(shuō)admin表和role表是一對(duì)一關(guān)系,role和auth表是多對(duì)多關(guān)系,本來(lái)符合范式設(shè)計(jì)要求的情況應(yīng)該是需要一張關(guān)聯(lián)表的,但是這里為了簡(jiǎn)單,就只把role擁有的auth寫(xiě)成一個(gè)字段auth_id_lst。所以具體的表設(shè)計(jì)就是:
admin
- admin_id
- admin_name
- role_id (foreign_key)
role
- role_id
- role_name
- auth_id_lst
auth
- auth_id
- auth_name
- auth_pid
為了更直接的理解,這里放幾個(gè)每張表的具體記錄:
auth
| auth_id | auth_name | auth_pid |
|---|---|---|
| 1 | 供應(yīng)商管理 | 0 |
| 2 | 供應(yīng)商添加 | 1 |
| 3 | 供應(yīng)商修改 | 1 |
| 4 | 商品管理 | 0 |
| 5 | 商品下架 | 4 |
| 6 | 顧客管理 | 0 |
role
| role_id | role_name | auth_id_lst |
|---|---|---|
| 1 | 物流部門(mén)經(jīng)理 | 1,2,3 |
| 2 | 銷(xiāo)售部門(mén)經(jīng)理 | 4,5 |
| 3 | 公關(guān)部門(mén)經(jīng)理 | 6 |
admin
| admin_id | admin_name | role_id |
|---|---|---|
| 1 | 張三 | 1 |
| 2 | 李四 | 2 |
| 3 | 王五 | 3 |
這樣就可以保存住具體的用戶(hù)所擁有的具體權(quán)限了,而其中為了能更好的管理具體auth,同時(shí)也為了更好的理解,所以加入了role表進(jìn)行補(bǔ)充,如果做一個(gè)類(lèi)似的話(huà),更像下面的形式:
- admin:具體人員
- role:部門(mén)
- auth:具體所需要的權(quán)限
同一個(gè)部門(mén)的人,所需要的權(quán)限基本是相同的,所以可以使用一個(gè)role進(jìn)行統(tǒng)一管理。
Part 2 代碼實(shí)現(xiàn)
上面只是簡(jiǎn)單做一個(gè)介紹,這一部分開(kāi)始將介紹具體的實(shí)施方案,來(lái)自于一個(gè)帶我的大哥??炊旅娴牟糠帜阈枰邆涞闹R(shí)點(diǎn)有:
- thinkphp的基礎(chǔ)知識(shí)
- session的用法
這個(gè)使用的場(chǎng)景是一個(gè)后臺(tái)管理系統(tǒng),針對(duì)不同role開(kāi)放不同的Controller(控制器)和Action(方法),所以auth表具體結(jié)構(gòu)如下:
admin
- auth_id
- auth_name
- auth_c 保存控制器名
- auth_a 保存方法名
- auth_pid 權(quán)限之間存在分類(lèi)情況,使用該字段進(jìn)行保存
接下來(lái)就是具體的操作步驟了:
1.1 新建Controller類(lèi)
在thinkphp中每個(gè)Controller都會(huì)繼承一個(gè)thinkphp下的Think\Controller,這個(gè)時(shí)候可以新建一個(gè)Controller,之后讓所有的Controller都繼承這個(gè)新建的類(lèi),這樣所有進(jìn)行的操作都要先經(jīng)過(guò)這個(gè)新建控制器的篩選。
下面是這個(gè)新建類(lèi)的部分內(nèi)容:
<?php
namespace Admin\Controller;
use Think\Controller;
class FatherController extends Controller{
// 構(gòu)造函數(shù)
public function __construct(){
// 實(shí)例化父類(lèi)構(gòu)造函數(shù)
parent::__construct();
// session('admin_id')會(huì)在后面的驗(yàn)證成功后被保存
// session()中的?表示判斷
fi(!session('?admin_id')){
$this->error('必須登錄后才可以執(zhí)行操作',U('Back/login'));
}
// 后面還有內(nèi)容,這里先到這里
}
}
?>
1.2 跳轉(zhuǎn)到登錄頁(yè)面
1.1中跳轉(zhuǎn)到一個(gè)登錄的頁(yè)面,在這個(gè)登錄頁(yè)面中輸入用戶(hù)名、密碼、驗(yàn)證碼之后,就可以調(diào)用專(zhuān)門(mén)Model類(lèi)來(lái)進(jìn)行驗(yàn)證了。這里就細(xì)講了,這里講解一下具體步驟:
- 在BackController的login方法中實(shí)例化AdminModel類(lèi)
- 在A(yíng)dminModel類(lèi)中設(shè)置自動(dòng)驗(yàn)證和自動(dòng)完成,保證用戶(hù)名和密碼都經(jīng)過(guò)驗(yàn)證
- 如果用戶(hù)名和密碼都正確,則將admin_id保存在session中,并從role表中讀取該用戶(hù)的role,與auth_id_lst,同樣保存在session中。這里做一下總結(jié):
session('admin_id') 登錄者的id
session('user_name') 登錄者注冊(cè)名
session('auth') 登錄者所擁有的role中的auth_id_lst中對(duì)應(yīng)auth表的具體值,格式為 Controller/Action
session('menu') 登錄者所能操作的具體的權(quán)限信息
1.3 回到最初新建的Controller類(lèi)
<?php
namespace Admin\Controller;
use Think\Controller;
class FatherController extends Controller{
// 構(gòu)造函數(shù)
public function __construct(){
// 實(shí)例化父類(lèi)構(gòu)造函數(shù)
parent::__construct();
// session('admin_id')會(huì)在后面的驗(yàn)證成功后被保存
// session()中的?表示判斷
fi(!session('?admin_id')){
$this->error('必須登錄后才可以執(zhí)行操作',U('Back/login'));
}
// 這里是后面新建的內(nèi)容
// CONTROLLER_NAME 當(dāng)前調(diào)用的控制器名,think的變量
// ACTION_NAME 與CONTROLLER_NAME一樣,表示當(dāng)前調(diào)用的控制器下的方法
$currentMethod=CONTROLLER_NAME.'/'.ACTION_NAME;
// 上面其實(shí)是thinkphp一般的pathinfo模式的url格式
// Index隨便調(diào)用,其實(shí)就是主頁(yè),在主頁(yè)有其他設(shè)置,用于展現(xiàn)其所擁有的權(quán)限,這個(gè)后面再看
if(CONTROLLER_NAME=='Index'){
return true;
}
// 讀取用戶(hù)所擁有的所有權(quán)限,已經(jīng)將字符串解析成數(shù)組形式了
$allowMethod=session('auth_id_lst');
// *表示超級(jí)用戶(hù),擁有所有權(quán)限,如果用戶(hù)請(qǐng)求超越自己權(quán)限的操作,則會(huì)顯示錯(cuò)誤提示頁(yè)面
if($allowMethod!='*' && !in_array($currentMethod, $allowMethod)){
$this->error('越權(quán)操作',U('Index/index'));
}
}
}
?>
1.4 主頁(yè)顯示內(nèi)容
主頁(yè)是使用thinkphp的內(nèi)置標(biāo)簽自動(dòng)生成的,所以只要把握好輸出的內(nèi)容,就可以限制住給于用戶(hù)的操作權(quán)限,上面說(shuō)過(guò),其中賦予用戶(hù)的操作權(quán)限都是保存在session('menu')中,所以只要在內(nèi)置標(biāo)簽中調(diào)用這個(gè)值進(jìn)行顯示就可以了,具體內(nèi)容就是這樣。
講的很爛我知道,畢竟只花了半個(gè)小時(shí)看其中的具體內(nèi)容,之后可能會(huì)嘗試自己寫(xiě)寫(xiě)看吧,那時(shí)候再說(shuō)吧。
更多關(guān)于thinkPHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《ThinkPHP入門(mén)教程》、《thinkPHP模板操作技巧總結(jié)》、《ThinkPHP常用方法總結(jié)》、《codeigniter入門(mén)教程》、《CI(CodeIgniter)框架進(jìn)階教程》、《Zend FrameWork框架入門(mén)教程》及《PHP模板技術(shù)總結(jié)》。
希望本文所述對(duì)大家基于ThinkPHP框架的PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
Laravel路由研究之domain解決多域名問(wèn)題的方法示例
這篇文章主要介紹了Laravel 路由研究之domain解決多域名問(wèn)題的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
淺談laravel 5.6 安裝 windows上使用composer的安裝過(guò)程
今天小編就為大家分享一篇淺談laravel 5.6 安裝 windows上使用composer的安裝過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
PhpStorm 2020.3:新增開(kāi)箱即用的PHP 8屬性(推薦)
這篇文章主要介紹了PhpStorm 2020.3:新增開(kāi)箱即用的PHP 8屬性的相關(guān)資料,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
php微信公眾平臺(tái)開(kāi)發(fā)之微信群發(fā)信息
這篇文章主要為大家詳細(xì)介紹了php微信公眾平臺(tái)開(kāi)發(fā)之微信群發(fā)信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
PHP模板引擎Smarty內(nèi)建函數(shù)foreach,foreachelse用法分析
這篇文章主要介紹了PHP模板引擎Smarty內(nèi)建函數(shù)foreach,foreachelse用法,結(jié)合實(shí)例形式分析了foreach,foreachelse的功能與具體使用技巧,需要的朋友可以參考下2016-04-04
純PHP生成的一個(gè)樹(shù)葉圖片畫(huà)圖例子
這篇文章主要介紹了純PHP生成的一個(gè)樹(shù)葉圖片畫(huà)圖例子,希望可以帶給使用PHP進(jìn)行圖像編程的朋友一些幫助。2014-04-04

