天天看點

ThinkPHP中的RBAC一、什麼是RBAC 二、ThinkPHP中的RBAC 三、config配置檔案詳解 四、RBAC類的幾個重要的方法

基于角色的通路控制(role-based access control)作為傳統通路控制(自主通路,強制通路)的有前景的代替受到廣泛的關注。

在rbac中,權限與角色相關聯,使用者通過成為适當角色的成員而得到這些角色的權限。這就極大地簡化了權限的管理。

在一個組織中,角色是為了完成各種工作而創造,使用者則依據它的責任和資格來被指派相應的角色,使用者可以很容易地從一個角色被指派到另一個角色。角色可依新的需求和系統的合并而賦予新的權限,而權限也可根據需要而從某角色中回收。角色與角色的關系可以建立起來以囊括更廣泛的客觀情況。

先看下官方給的執行個體所用到的資料表,通過5張表實作權限控制,定義如下:

rbac 要用到5個資料表

think_user (使用者表)

think_role (使用者分組表)

think_node (操作節點)

think_role_user (使用者和使用者分組的對應)

think_access (各個操作和使用者組的對應)

使用者表

角色表,有哪些角色,該角色與對應的userid使用者相關聯

根據使用者表的id給出對應的角色id相關聯,也就是給使用者配置設定角色,比如userid為3的角色為2,根據role角色表,7代表員工的角色

access表,權限表,比如角色id為2,也就是員工的權限,可以的對應的結點

結點表,代表有哪些應用-子產品-子產品方法,并且定義了之間的一種關系,比如noteid為30的是public子產品,noteid為31,32,33,34的方法add,insert,edit,update都屬于public。noteid為85的test方法,屬于noteid為84的game子產品下的方法。

我們看看thinkphp官方示例中的config檔案:

ThinkPHP中的RBAC一、什麼是RBAC 二、ThinkPHP中的RBAC 三、config配置檔案詳解 四、RBAC類的幾個重要的方法
ThinkPHP中的RBAC一、什麼是RBAC 二、ThinkPHP中的RBAC 三、config配置檔案詳解 四、RBAC類的幾個重要的方法

大家看注釋就應該懂大半了,其中public子產品是無需認證的,道理很簡單,沒登入之前大家都是遊客身份,如果登入頁面也要權限,那從哪裡登入呢?是吧,呵呵。預設網關位址就是認證失敗,沒有權限跳轉到此處,重新登陸。admin_auth_key表示超級管理者權限,如果你在user表建立一個名為admin的使用者,那麼這個使用者就是超級管理者,不用給它配置設定權限,什麼權限都有,為什麼要設定一個這樣的管理者,因為當你把權限配置設定錯了容易引起系統權限混亂,搞得大家都通路不了,這時候超級管理者就來了。

authenticate($map,$model=”)方法 傳入查詢使用者的條件和使用者表的model 傳回數組包含使用者的資訊

saveaccesslist($authid=null)方法 傳入使用者的id 此方法不傳回值,隻是設定

$_session['_access_list']的值,其中包含了所有該使用者對應的使用者組的有權限操作的所有節點

$_session['_access_list']['項目名']['子產品名']['操作名'],以後判斷權限就是判斷目前項目,子產品和操作是否在

$_session['_access_list']中能找到。s

checkaccess() 方法 檢測目前子產品和操作是否需要驗證 傳回bool類型

checklogin()方法 檢測登入

accessdecision($appname=app_name) 方法 就是檢測目前項目子產品操作

是否在$_session['_access_list']數組中,也就是說 在 $_session['_access_list']

數組中$_session['_access_list']['目前操作']['目前子產品']['目前操作']是否存在。如果存在表示有權限

否則傳回flase。

getaccesslist($authid) 方法 通過查詢資料庫 傳回權限清單 $_session['_access_list']的值了。