thinkPHP框架RBAC實現原理分析

2022-09-26 06:48:12 字數 2626 閱讀 8735

rbac就是:role based access controller,基於角色(role)的許可權(access)管理,這裡簡單介紹一下他的原理與實現方式之一。

part 1 資料庫設計

首先最基本的組成有:使用者(admin),角色(role),具體許可權(auth),這三者之間的關係是這樣的:乙個使用者只擁有一種角色,一種角色下擁有多個許可權,乙個許可權也會同時被多個角色擁有,也就是說admin表和role表是一對一關係,role和auth表是多對多關係,本來符合正規化設計要求的情況應該是需要一張關聯表的,但是這裡為了簡單,就只把role擁有的auth寫成乙個欄位auth_id_lst。所以具體的表設計就是:

admin

role

auth

為了更直接的理解,這裡放幾個每張表的具體記錄:

auth

auth_id

auth_name

auth_pid

1**商管理02

**商新增13

**商修改14

商品管理05

商品下架46

顧客管理

0role

role_id

role_name

auth_id_lst

1物流部門經理

1,2,3

2銷售部門經理

4,53

公關部門經理

6admin

admin_id

admin_name

role_id1張三

12李四2

3王五

3這樣就可以儲存住具體的使用者所擁有的具體許可權了,而其中為了能更好的管理具體auth,同時也為了更好的www.cppcns.com理解,所以加入了role表進行補充,如果做乙個類似的話,更像下面的形式:

同乙個部門的人,所需要的許可權基本是相同的,所以可以使用乙個role進行統一管理。

part 2 **實現

上面只是簡單做乙個介紹,這一部分開始將介紹具體的實施方案,來自於乙個帶我的大哥。看懂下面的部分你需要具備的知識點有:

這個使用的場景是乙個後台管理系統,針對不同role開放不同的controller(控制器)和action(方法),所以auth表具體結構如下:

admin

接下來就是具體的操作步驟了:

1.1 新建controller類

在thinkphp中每個controller都會繼承乙個thinkphp下的think\controller,這個時候可以新建乙個controller,之後讓所有的controller都繼承這個新建的類,這樣所有進行的操作都要先經過這個新建控制器的篩選。

下面是這個新建類的部分內容:

<?php namespace admin\controller;

use think\controller;

class fathercontroller extends controller

// 後面還有內容,這裡先到這裡

}}?>

1.2 跳轉到登入頁面

1.1中跳轉到乙個登入的頁面,在這個登入頁面中輸入使用者名稱、密碼、驗證碼之後,就可以呼叫專門model類來進行驗證了。這裡就細講了,這裡講解一下具體步驟:

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

// 這裡是後面新建的內容

// controller_name 當前呼叫的控制器名,think的變數

// action_name 與controller_name一樣,表示當前呼叫的控制器下的方法

$currentmethod=controller_name.'/'.action_name;

// 上面其實是thinkphp一般的pathinfo模式的url格式

// index隨便呼叫,其實就是主頁,在主頁有其他設定,用於展現其所擁有的許可權,這個後面再看

if(controller_name=='index')

// 讀取使用者所擁有的所有許可權,已經將字串解析成陣列形式了

$allowmethod=session('auth_id_lst');

// *表示超級使用者,擁有所有許可權,如果使用者請求超越自己許可權的操作,則會顯示錯誤提示頁面

if($allowmethod!='*' && !in_array($currentmethod, $allowmethod))

}}?>

1.4 主頁顯示內容

主頁是使用thinkphp的內建標籤自動生成的,所以只要把握好輸出的內容,就可以限制住給於使用者的操作許可權,上面說過,其中賦予使用者的操作許可權都是儲存在session('menu')中,所以只要在內建標籤中呼叫這個值進行顯示就可以了,具體內容就是這樣。

講的很爛我知道,畢竟只花了半個小時看其中的具體內容,之後可能會嘗試自己寫寫看吧,那時候再說吧。

RBAC基礎框架搭建

1 建立資料庫,找到schema mysql.sql,有建立資料庫的原始碼,建立資料表,自己新增資料 2 通過gii在common models目錄下生成各個資料表對應的資料模型 3 通過gii生產auth item表的控制層以及檢視層 注意 如果直接生成控制器和檢視會出現錯誤,必須將所有資料表都g...

基於thinkphp的RBAC許可權控制

rbac role based access control 許可權控制在後台管理中是十分常見的,它的模型大體上是下面這張圖的形式 我用的字段和上面不一樣,圖只是個示例 乙個簡易的許可權控制模型只需要3個表就行了 user表 記錄使用者的資訊和使用者的角色 user id 使用者的id user r...

thinkphp5 1 框架鉤子和行為用法例項分析

thinkphp中的行為是乙個比較抽象的概念,可以把行為想象成在應用執行過程中的乙個動程式設計客棧作。在框架的執行流程中,例如路由檢測是乙個行為,靜態快取是乙個行為,使用者許可權檢測也是行為,大到業務邏輯,小到瀏覽器檢測 多語言檢測等等都可以當做是乙個行為,www.cppcns.com甚至說你希望給...