最近用thinkphp作了個項目,客戶今天又提了個新要求 管理員分權限管理。之前大楷看過THINKPHP 的RBAC的介紹沒仔細研究 ,如今用到了就找個地方把我對RBAC的理解記一下,省得之後忘記了。php
先看下官方給的實例所用到的數據表node
RBAC 用到了5個數據表thinkphp
think_user (用戶表)數據庫
think_role (用戶分組表)數組
think_node (操做節點)app
think_role_user (用戶和用戶分組的對應)網站
think_access (各個操做和用戶組的對應)spa
這裏重點說一下 think_noteorm
think_note 其實就是記錄下了整個網站操做對應的 項目名稱 模塊名稱 和 操做名稱。ci
字段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.
再說下 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']的值了。
上面的記錄就是 我我的對RBAC的理解。在開發過程當中還遇到個問題,個人項目一有一個 ,可是我又想把 幾個模塊分開管理。想了半天發現AccessDecision($appName=APP_NAME) 是能夠傳項目名稱的。那麼 咱們先分幾個組,也就是LEVEL=1,PID=0的,而後 把模塊分組管理。在使用的時候就麻煩點。每一個分組都建一個基類,在基類中if (! RBAC::AccessDecision ()) { 手動給 AccessDecision添加參數,就是當前分組的名稱。而後屬於某個分組的模塊就引用這基類。這樣就達到了同一項目下 分組管理模塊的功能了。