1. 程式人生 > >分享:thinkphp RBAC 詳解

分享:thinkphp RBAC 詳解

一、什麼是RBAC

基於角色的訪問控制(Role-Based Access Control)作為傳統訪問控制(自主訪問,強制訪問)的有前景的代替受到廣泛的關注。

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

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

二、ThinkPHP中的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模組下的方法。

三、config配置檔案詳解

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

複製程式碼
array(
        'APP_AUTOLOAD_PATH'=>'@.TagLib',
        'SESSION_AUTO_START'=>true,
        'USER_AUTH_ON'              =>true,
        'USER_AUTH_TYPE'            =>1,        // 預設認證型別 1 登入認證 2 實時認證
        'USER_AUTH_KEY'             =>'authId',    //
使用者認證SESSION標記 'ADMIN_AUTH_KEY' =>'administrator', 'USER_AUTH_MODEL' =>'User', // 預設驗證資料表模型 'AUTH_PWD_ENCODER' =>'md5', // 使用者認證密碼加密方式 'USER_AUTH_GATEWAY' =>'/Public/login',// 預設認證閘道器 'NOT_AUTH_MODULE' =>'Public', // 預設無需認證模組 'REQUIRE_AUTH_MODULE' =>'', // 預設需要認證模組 'NOT_AUTH_ACTION' =>'', // 預設無需認證操作 'REQUIRE_AUTH_ACTION' =>'', // 預設需要認證操作 'GUEST_AUTH_ON' =>false, // 是否開啟遊客授權訪問 'GUEST_AUTH_ID' =>0, // 遊客的使用者ID 'DB_LIKE_FIELDS' =>'title|remark', 'RBAC_ROLE_TABLE' =>'think_role', 'RBAC_USER_TABLE' =>'think_role_user', 'RBAC_ACCESS_TABLE' =>'think_access', 'RBAC_NODE_TABLE' =>'think_node', 'SHOW_PAGE_TRACE'=>1//顯示除錯資訊 );
複製程式碼

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

四、RBAC類的幾個重要的方法

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']的值了。