thinkphp RBAC 詳解

最近用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添加參數,就是當前分組的名稱。而後屬於某個分組的模塊就引用這基類。這樣就達到了同一項目下 分組管理模塊的功能了。

相關文章
相關標籤/搜索