基於角色的訪問控制(Role-Based Access Control)做爲傳統訪問控制(自主訪問,強制訪問)的有前景的代替受到普遍的關注。php
在RBAC中,權限與角色相關聯,用戶經過成爲適當角色的成員而獲得這些角色的權限。這就極大地簡化了權限的管理。node
在一個組織中,角色是爲了完成各類工做而創造,用戶則依據它的責任和資格來被指派相應的角色,用戶能夠很容易地從一個角色被指派到另外一個角色。角色可依新的需求和系統的合併而賦予新的權限,而權限也可根據須要而從某角色中回收。角色與角色的關係能夠創建起來以囊括更普遍的客觀狀況。 git
先看下官方給的實例所用到的數據表,經過5張表實現權限控制,定義以下:github
RBAC 要用到5個數據表web
think_user (用戶表)thinkphp
think_role (用戶分組表)數據庫
think_node (操做節點)數組
think_role_user (用戶和用戶分組的對應)app
think_access (各個操做和用戶組的對應)ide
用戶表
角色表,有哪些角色,該角色與對應的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模塊下的方法。
字段name就是當項目,模塊或者操做的名稱了。
字段PID 記錄他們的從屬關係,好比某一個模塊是屬於哪一個項目,某個操做屬於哪一個模塊。
字段level 表示該節點的層級 換句話就是說 level=1 爲項目 ,level=2爲模塊 ,level=3就是操做了,好比說 admin項目,他的PID 就是 0 (項目的PID都是0) level就是1,nane就是admin了,admin項目下面有的user模塊,它的level就應該是2,pid就是admin的id, admin下面user模塊的add操做,level就該是3了,pid就應該是前面的user對應的ID.
咱們看看thinkphp官方示例中的config文件:
你們看註釋就應該懂大半了,其中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’]的值了。