一、什么是RBAC基于角色的訪問控制(Role-Based Access Control)作為傳統(tǒng)訪問控制(自主訪問,強(qiáng)制訪問)的有前景的代替受到廣泛的關(guān)注。 在RBAC中,權(quán)限與角色相關(guān)聯(lián),用戶通過成為適當(dāng)角色的成員而得到這些角色的權(quán)限。這就極大地簡化了權(quán)限的管理。 在一個組織中,角色是為了完成各種工作而創(chuàng)造,用戶則依據(jù)它的責(zé)任和資格來被指派相應(yīng)的角色,用戶可以很容易地從一個角色被指派到另一個角色。角色可依新的需求和系統(tǒng)的合并而賦予新的權(quán)限,而權(quán)限也可根據(jù)需要而從某角色中回收。角色與角色的關(guān)系可以建立起來以囊括更廣泛的客觀情況。 二、ThinkPHP中的RBAC先看下官方給的實(shí)例所用到的數(shù)據(jù)表,通過5張表實(shí)現(xiàn)權(quán)限控制,定義如下: RBAC 要用到5個數(shù)據(jù)表 think_user (用戶表) think_role (用戶分組表) think_node (操作節(jié)點(diǎn)) think_role_user (用戶和用戶分組的對應(yīng)) think_access (各個操作和用戶組的對應(yīng))
三、config配置文件詳解我們看看thinkphp官方示例中的config文件: array( 'APP_AUTOLOAD_PATH'=>'@.TagLib', 'SESSION_AUTO_START'=>true, 'USER_AUTH_ON' =>true, 'USER_AUTH_TYPE' =>1, // 默認(rèn)認(rèn)證類型 1 登錄認(rèn)證 2 實(shí)時認(rèn)證 'USER_AUTH_KEY' =>'authId', // 用戶認(rèn)證SESSION標(biāo)記 'ADMIN_AUTH_KEY' =>'administrator', 'USER_AUTH_MODEL' =>'User', // 默認(rèn)驗(yàn)證數(shù)據(jù)表模型 'AUTH_PWD_ENCODER' =>'md5', // 用戶認(rèn)證密碼加密方式 'USER_AUTH_GATEWAY' =>'/Public/login',// 默認(rèn)認(rèn)證網(wǎng)關(guān) 'NOT_AUTH_MODULE' =>'Public', // 默認(rèn)無需認(rèn)證模塊 'REQUIRE_AUTH_MODULE' =>'', // 默認(rèn)需要認(rèn)證模塊 'NOT_AUTH_ACTION' =>'', // 默認(rèn)無需認(rèn)證操作 'REQUIRE_AUTH_ACTION' =>'', // 默認(rèn)需要認(rèn)證操作 'GUEST_AUTH_ON' =>false, // 是否開啟游客授權(quán)訪問 '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//顯示調(diào)試信息 ); 大家看注釋就應(yīng)該懂大半了,其中Public模塊是無需認(rèn)證的,道理很簡單,沒登錄之前大家都是游客身份,如果登錄頁面也要權(quán)限,那從哪里登錄呢?是吧,呵呵。默認(rèn)網(wǎng)關(guān)地址就是認(rèn)證失敗,沒有權(quán)限跳轉(zhuǎn)到此處,重新登陸。ADMIN_AUTH_KEY表示超級管理員權(quán)限,如果你在user表建立一個名為admin的用戶,那么這個用戶就是超級管理員,不用給它分配權(quán)限,什么權(quán)限都有,為什么要設(shè)置一個這樣的管理員,因?yàn)楫?dāng)你把權(quán)限分配錯了容易引起系統(tǒng)權(quán)限混亂,搞得大家都訪問不了,這時候超級管理員就來了。 四、RBAC類的幾個重要的方法authenticate($map,$model=”)方法 傳入查詢用戶的條件和用戶表的MODEL 返回?cái)?shù)組包含用戶的信息 saveAccessList($authId=null)方法 傳入用戶的ID 此方法不返回值,只是設(shè)置 $_SESSION['_ACCESS_LIST']的值,其中包含了所有該用戶對應(yīng)的用戶組的有權(quán)限操作的所有節(jié)點(diǎn) $_SESSION['_ACCESS_LIST']['項(xiàng)目名']['模塊名']['操作名'],以后判斷權(quán)限就是判斷當(dāng)前項(xiàng)目,模塊和操作是否在 $_SESSION['_ACCESS_LIST']中能找到。s checkAccess() 方法 檢測當(dāng)前模塊和操作是否需要驗(yàn)證 返回bool類型 checkLogin()方法 檢測登錄 AccessDecision($appName=APP_NAME) 方法 就是檢測當(dāng)前項(xiàng)目模塊操作 是否在$_SESSION['_ACCESS_LIST']數(shù)組中,也就是說 在 $_SESSION['_ACCESS_LIST'] 數(shù)組中$_SESSION['_ACCESS_LIST']['當(dāng)前操作']['當(dāng)前模塊']['當(dāng)前操作']是否存在。如果存在表示有權(quán)限 否則返回flase。 getAccessList($authId) 方法 通過查詢數(shù)據(jù)庫 返回權(quán)限列表 $_SESSION['_ACCESS_LIST']的值了。
(本文由小談博客整理:http://tanteng.sinaapp.com/2012/11/thinkphp-rbac/) |
|