thinkPHP框架RBAC實現(xiàn)原理分析
本文實例講述了thinkPHP框架RBAC實現(xiàn)原理。分享給大家供大家參考,具體如下:
RBAC就是:Role Based Access Controller,基于角色(role)的權限(Access)管理,這里簡單介紹一下他的原理與實現(xiàn)方式之一。
Part 1 數(shù)據(jù)庫設計
首先最基本的組成有:用戶(admin),角色(role),具體權限(auth),這三者之間的關系是這樣的:一個用戶只擁有一種角色,一種角色下?lián)碛卸鄠€權限,一個權限也會同時被多個角色擁有,也就是說admin表和role表是一對一關系,role和auth表是多對多關系,本來符合范式設計要求的情況應該是需要一張關聯(lián)表的,但是這里為了簡單,就只把role擁有的auth寫成一個字段auth_id_lst。所以具體的表設計就是:
admin
- admin_id
- admin_name
- role_id (foreign_key)
role
- role_id
- role_name
- auth_id_lst
auth
- auth_id
- auth_name
- auth_pid
為了更直接的理解,這里放幾個每張表的具體記錄:
auth
auth_id | auth_name | auth_pid |
---|---|---|
1 | 供應商管理 | 0 |
2 | 供應商添加 | 1 |
3 | 供應商修改 | 1 |
4 | 商品管理 | 0 |
5 | 商品下架 | 4 |
6 | 顧客管理 | 0 |
role
role_id | role_name | auth_id_lst |
---|---|---|
1 | 物流部門經理 | 1,2,3 |
2 | 銷售部門經理 | 4,5 |
3 | 公關部門經理 | 6 |
admin
admin_id | admin_name | role_id |
---|---|---|
1 | 張三 | 1 |
2 | 李四 | 2 |
3 | 王五 | 3 |
這樣就可以保存住具體的用戶所擁有的具體權限了,而其中為了能更好的管理具體auth,同時也為了更好的理解,所以加入了role表進行補充,如果做一個類似的話,更像下面的形式:
- admin:具體人員
- role:部門
- auth:具體所需要的權限
同一個部門的人,所需要的權限基本是相同的,所以可以使用一個role進行統(tǒng)一管理。
Part 2 代碼實現(xiàn)
上面只是簡單做一個介紹,這一部分開始將介紹具體的實施方案,來自于一個帶我的大哥??炊旅娴牟糠帜阈枰邆涞闹R點有:
- thinkphp的基礎知識
- session的用法
這個使用的場景是一個后臺管理系統(tǒng),針對不同role開放不同的Controller(控制器)和Action(方法),所以auth表具體結構如下:
admin
- auth_id
- auth_name
- auth_c 保存控制器名
- auth_a 保存方法名
- auth_pid 權限之間存在分類情況,使用該字段進行保存
接下來就是具體的操作步驟了:
1.1 新建Controller類
在thinkphp中每個Controller都會繼承一個thinkphp下的Think\Controller,這個時候可以新建一個Controller,之后讓所有的Controller都繼承這個新建的類,這樣所有進行的操作都要先經過這個新建控制器的篩選。
下面是這個新建類的部分內容:
<?php namespace Admin\Controller; use Think\Controller; class FatherController extends Controller{ // 構造函數(shù) public function __construct(){ // 實例化父類構造函數(shù) parent::__construct(); // session('admin_id')會在后面的驗證成功后被保存 // session()中的?表示判斷 fi(!session('?admin_id')){ $this->error('必須登錄后才可以執(zhí)行操作',U('Back/login')); } // 后面還有內容,這里先到這里 } } ?>
1.2 跳轉到登錄頁面
1.1中跳轉到一個登錄的頁面,在這個登錄頁面中輸入用戶名、密碼、驗證碼之后,就可以調用專門Model類來進行驗證了。這里就細講了,這里講解一下具體步驟:
- 在BackController的login方法中實例化AdminModel類
- 在AdminModel類中設置自動驗證和自動完成,保證用戶名和密碼都經過驗證
- 如果用戶名和密碼都正確,則將admin_id保存在session中,并從role表中讀取該用戶的role,與auth_id_lst,同樣保存在session中。這里做一下總結:
session('admin_id')
登錄者的id
session('user_name')
登錄者注冊名
session('auth')
登錄者所擁有的role中的auth_id_lst中對應auth表的具體值,格式為 Controller/Action
session('menu')
登錄者所能操作的具體的權限信息
1.3 回到最初新建的Controller類
<?php namespace Admin\Controller; use Think\Controller; class FatherController extends Controller{ // 構造函數(shù) public function __construct(){ // 實例化父類構造函數(shù) parent::__construct(); // session('admin_id')會在后面的驗證成功后被保存 // session()中的?表示判斷 fi(!session('?admin_id')){ $this->error('必須登錄后才可以執(zhí)行操作',U('Back/login')); } // 這里是后面新建的內容 // CONTROLLER_NAME 當前調用的控制器名,think的變量 // ACTION_NAME 與CONTROLLER_NAME一樣,表示當前調用的控制器下的方法 $currentMethod=CONTROLLER_NAME.'/'.ACTION_NAME; // 上面其實是thinkphp一般的pathinfo模式的url格式 // Index隨便調用,其實就是主頁,在主頁有其他設置,用于展現(xiàn)其所擁有的權限,這個后面再看 if(CONTROLLER_NAME=='Index'){ return true; } // 讀取用戶所擁有的所有權限,已經將字符串解析成數(shù)組形式了 $allowMethod=session('auth_id_lst'); // *表示超級用戶,擁有所有權限,如果用戶請求超越自己權限的操作,則會顯示錯誤提示頁面 if($allowMethod!='*' && !in_array($currentMethod, $allowMethod)){ $this->error('越權操作',U('Index/index')); } } } ?>
1.4 主頁顯示內容
主頁是使用thinkphp的內置標簽自動生成的,所以只要把握好輸出的內容,就可以限制住給于用戶的操作權限,上面說過,其中賦予用戶的操作權限都是保存在session('menu')中,所以只要在內置標簽中調用這個值進行顯示就可以了,具體內容就是這樣。
講的很爛我知道,畢竟只花了半個小時看其中的具體內容,之后可能會嘗試自己寫寫看吧,那時候再說吧。
更多關于thinkPHP相關內容感興趣的讀者可查看本站專題:《ThinkPHP入門教程》、《thinkPHP模板操作技巧總結》、《ThinkPHP常用方法總結》、《codeigniter入門教程》、《CI(CodeIgniter)框架進階教程》、《Zend FrameWork框架入門教程》及《PHP模板技術總結》。
希望本文所述對大家基于ThinkPHP框架的PHP程序設計有所幫助。
相關文章
YII中Ueditor富文本編輯器文件和圖片上傳的配置圖文教程
本文主要給大家介紹了YII中Ueditor富文本編輯器文件和圖片上傳的配置圖文教程,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-03-03PHP設計模式(四)原型模式Prototype實例詳解【創(chuàng)建型】
這篇文章主要介紹了PHP設計模式:原型模式Prototype,結合實例形式詳細分析了PHP原型模式Prototype的基本概念、功能、原理、實現(xiàn)方法與操作注意事項,需要的朋友可以參考下2020-05-05PHP實現(xiàn)的交通銀行網(wǎng)銀在線支付接口ECSHOP插件和使用例子
這篇文章主要介紹了PHP實現(xiàn)的交通銀行網(wǎng)銀在線支付接口ECSHOP插件和使用例子,需要的朋友可以參考下2014-05-05