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 | 物流部門經(jīng)理 | 1,2,3 |
2 | 銷售部門經(jīng)理 | 4,5 |
3 | 公關(guān)部門經(jīng)理 | 6 |
admin
admin_id | admin_name | role_id |
---|---|---|
1 | 張三 | 1 |
2 | 李四 | 2 |
3 | 王五 | 3 |
這樣就可以保存住具體的用戶所擁有的具體權(quán)限了,而其中為了能更好的管理具體auth,同時(shí)也為了更好的理解,所以加入了role表進(jìn)行補(bǔ)充,如果做一個(gè)類似的話,更像下面的形式:
同一個(gè)部門的人,所需要的權(quán)限基本是相同的,所以可以使用一個(gè)role進(jìn)行統(tǒng)一管理。
Part 2 代碼實(shí)現(xiàn)
上面只是簡(jiǎn)單做一個(gè)介紹,這一部分開始將介紹具體的實(shí)施方案,來(lái)自于一個(gè)帶我的大哥??炊旅娴牟糠帜阈枰邆涞闹R(shí)點(diǎn)有:
這個(gè)使用的場(chǎng)景是一個(gè)后臺(tái)管理系統(tǒng),針對(duì)不同role開放不同的Controller(控制器)和Action(方法),所以auth表具體結(jié)構(gòu)如下:
admin
接下來(lái)就是具體的操作步驟了:
1.1 新建Controller類
在thinkphp中每個(gè)Controller都會(huì)繼承一個(gè)thinkphp下的Think\Controller,這個(gè)時(shí)候可以新建一個(gè)Controller,之后讓所有的Controller都繼承這個(gè)新建的類,這樣所有進(jìn)行的操作都要先經(jīng)過(guò)這個(gè)新建控制器的篩選。
下面是這個(gè)新建類的部分內(nèi)容:
?php namespace Admin\Controller; use Think\Controller; class FatherController extends Controller{ // 構(gòu)造函數(shù) public function __construct(){ // 實(shí)例化父類構(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è)面中輸入用戶名、密碼、驗(yàn)證碼之后,就可以調(diào)用專門Model類來(lái)進(jìn)行驗(yàn)證了。這里就細(xì)講了,這里講解一下具體步驟:
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類
?php namespace Admin\Controller; use Think\Controller; class FatherController extends Controller{ // 構(gòu)造函數(shù) public function __construct(){ // 實(shí)例化父類構(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; } // 讀取用戶所擁有的所有權(quán)限,已經(jīng)將字符串解析成數(shù)組形式了 $allowMethod=session('auth_id_lst'); // *表示超級(jí)用戶,擁有所有權(quán)限,如果用戶請(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)容,就可以限制住給于用戶的操作權(quán)限,上面說(shuō)過(guò),其中賦予用戶的操作權(quán)限都是保存在session('menu')中,所以只要在內(nèi)置標(biāo)簽中調(diào)用這個(gè)值進(jìn)行顯示就可以了,具體內(nèi)容就是這樣。
講的很爛我知道,畢竟只花了半個(gè)小時(shí)看其中的具體內(nèi)容,之后可能會(huì)嘗試自己寫寫看吧,那時(shí)候再說(shuō)吧。
更多關(guān)于thinkPHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《ThinkPHP入門教程》、《thinkPHP模板操作技巧總結(jié)》、《ThinkPHP常用方法總結(jié)》、《codeigniter入門教程》、《CI(CodeIgniter)框架進(jìn)階教程》、《Zend FrameWork框架入門教程》及《PHP模板技術(shù)總結(jié)》。
希望本文所述對(duì)大家基于ThinkPHP框架的PHP程序設(shè)計(jì)有所幫助。
標(biāo)簽:萊蕪 溫州 呼倫貝爾 金華 清遠(yuǎn) 紹興 綏化 安康
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《thinkPHP框架RBAC實(shí)現(xiàn)原理分析》,本文關(guān)鍵詞 thinkPHP,框架,RBAC,實(shí)現(xiàn),原理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。