ThinkPHP rbac許可權管理

2022-04-04 07:27:07 字數 3951 閱讀 2597

【一】概論

(1)簡介

rbac(role based access controal),全稱基於使用者組/角色的許可權控制。

(2)概況

目前來說,一般專案有兩種許可權管理方式①傳統方式;②rbac方式。下面依次介紹下

【二】傳統模式與rbac模式對比

(1)傳統許可權分配方式

典型特徵:將許可權和使用者掛鉤,直接將許可權繫結到使用者。例如ecs電商管理平台的人員許可權分配

(2)rbac許可權管理方式

在使用時有兩種體現方式①基於表結構的rbac許可權管理;②基於檔案結構的rbac許可權管理

區別:資料的儲存位置,基於表結構的資料儲存在資料表(3表、5表),基於檔案結構的資料儲存在檔案裡。但原理相同

拓展:3表和5表區別,若將資料拆分到不可拆分的程度,使用5表;否則使用3表

3表包含:使用者表、使用者組表、許可權表;5表就是將3表裡的許可權表、使用者組表進行再次拆分。

基於資料表的形式:優點在於後期資料維護上更加方便,有介面來運算元據表。

基於檔案的形式:優點在於簡單容易理解,缺點是不易於維護(因為寫在了檔案裡,沒有維護介面。所以後期維護修改時比較困難)

(3)rbac原理

描述:在使用者登入的時候,會持久化使用者登入資訊(如角色id),然後根據id去查詢該角色的許可權。這裡的許可權是使用者組許可權

然後在中間控制器中去獲取當前使用者訪問的控制名和方法名,組成與預定義格式一致的形式,來判斷組成後的形式在不在許可權資訊當中。如果在則表示有許可權,如果不在則表示沒有許可權。

(4)rbac許可權分配方式

rbac許可權方式的最大特點:將許可權和使用者組掛鉤

,然後將使用者組和使用者進行掛鉤。

從圖中可以發現rbac模式優點:①設計時專案前期,許可權的標準就已經可以做到統一了;②維護上更加簡單快捷 

一般大型**專案裡,使用rbac模式較多

【三】案例

針對oa系統,實現rbac許可權管理

第一步:定義使用者組的許可權資訊資料,當前模式是基於檔案的許可權管理方式,所以資料需要寫在檔案裡。

寫在哪個檔案裡呢?

可以寫在配置檔案或者單獨寫檔案引入。這裡建議寫在配置檔案裡,因為配置檔案是系統自動載入的,所以寫在配置檔案裡,後期用的話不需要再進行引入了。

這裡我推薦選擇應用級別配置檔案common]conf\config.php

之前說過3表為使用者表、使用者組表、許可權表

將許可權配置寫到下面即可

//

rbac許可權資料

// 1. 角色陣列

'rbac_roles' => array

( 1 => '高層管理',

2 => '中層領導',

3 => '普通職員'),

//2. 許可權陣列(關聯角色陣列),通過數字123將角色和許可權陣列關聯

'rbac_role_auths' => array

( 1 => '*/*',//

擁有全部許可權(當前控制器名和方法名組成的許可權),這裡的/區別控制器和方法

2 => array('email/*','doc/*','knowledge/*'),//

中層管理

3 => array('email/*','knowledge/*')

),

第二步:在指定地方去根據當前使用者的role_id來獲取當前使用者應當有的許可權。通過使用者組id拿到相應許可權,拿到許可權資訊後再獲取許可權名和方法名.

換用旺使用者登入,許可權為3

因為要根據當前使用者的role_id去獲取判斷使用者許可權,既然和fq一樣,也和許可權掛鉤了。為了防止fq,寫到了中間控制器裡,這裡同樣也需要判斷許可權,所以和fq寫到一起。減少**重複。寫到控制器commoncontroller.class.php裡

第三步:編寫位置----中間控制器的構造方法

第四步:先測試下使用者的role_id,這裡我登入的使用者是旺,role_id為3.所以瀏覽器顯示3

關於登入時使用者資訊的持久化在登入控制器裡已經寫好了

接著因為許可權資訊在配置檔案裡,所以接下來用c方法讀取配置資訊,獲取許可權

//

因為許可權資訊在配置檔案裡,所以接下來用c方法讀取配置資訊,獲取許可權

$rbac_role_auths = c('rbac_role_auths');//

獲取全部的使用者組的許可權

dump($rbac_role_auths);die;

這裡輸出列印下是否獲取到全部許可權資訊,瀏覽器顯示結果

array(3) 

[3] => array(2)

}

接下來獲取當前使用者的許可權,然後輸出列印下

$currroleauth = $rbac_role_auths[$role_id];//

獲取當前使用者對應的許可權

dump($currroleauth);die;

瀏覽器顯示結果為

array(2)
此時上面已經走完了

接下來下面

第四步:通過常量的方式獲取當前使用者訪問的路由中控制器名和方法名,並且組成預定義的格式

可以理解為,在中間控制器構造方法裡獲取當前訪問的控制器名和方法名,通過什麼獲取呢?通過常量獲取

//

通過常量的方式獲取當前使用者訪問的路由中控制器名和方法名

$controller =strtolower(controller_name);//轉成和預定義的一樣,小寫

dump(

$controller);die;

瀏覽器輸出控制器名index

接下來獲取方法名,繼續新增

//

通過常量的方式獲取當前使用者訪問的路由中控制器名和方法名

$controller = strtolower

(controller_name);

$action = strtolower(action_name);

第五步:判斷是否有許可權

判斷依據:判斷組成的形式是否在許可權陣列裡,若在則表示有許可權,否則沒有許可權

//

判斷許可權,先排除超級管理員的情況

if ($role_id > 1)

}

此時重新整理瀏覽器驗證下,會登入成功,但是顯示首頁失敗,一直顯示沒有許可權,然後重新登入,然後沒有許可權,然後重新登入。。。。。在沒有許可權和登入一直迴圈

為什麼會出現這種情況呢?

原來因為沒有在配置檔案裡加index控制器,所以接下來加上

現在可以進行驗證測試了,普通員工沒有職員管理的許可權,所以如果點選職員管理會提示沒有許可權

如果想讓使用者在跳頁時跳轉到首頁,可以在控制器裡編寫方法

【總結】

按照步驟執行

ThinkPhp RBAC實現原理

rbac是英文role based access control的縮寫,是基於角色訪問進行控制的機制。意思是給每個使用者設定乙個角色,然後根據這個角色來判斷使用者的許可權。在此基於thinkphp的mvc模式進行簡單的小結 thinkphp的訪問由模組和操作兩部分進行控制 rbac一般有五張表組成,...

mysql def許可權 mysql使用者許可權管理

mysql資料在實際生產環境中大量被使用,那平時在做好伺服器上防火牆策略以外平時,對mysql下的使用者許可權也要嚴格管理,mysql的使用者許可權都是放在mysql.user這張表裡,平時的使用者許可權管理都是隱式使用著這張表的,先說下許可權 許可權意義 select查詢 insert插入 upd...

ThinkPHP RBAC官網的例子詳解

think access表 作用是看某個組是否有許可權訪問某個模組下的方法或者訪問某個模組,這個表少乙個pid欄位,自己新增就可以了 think node表,節點表 作用是把所有需要的模組,模組下的方法都新增進來管理,用這個也可以直接讀取成後台的導航 name欄位是模組,方法的名稱,比如index模...