最近用thinkphp做了個專案,客戶今天又提了個新要求 管理員分HTTP://www.aliyun.com/zixun/aggregation/18083.html">版權管理。 以前看過THINKPHP 的RBAC的介紹沒仔細研究 ,現在用到了就找個地方把我對RBAC的理解記一下,免得以後忘記了。
先看下官方給的實例所用到的6184.html">資料表
RBAC 用到了5個數據表
think_user (使用者表)
think_role (使用者分組表)
think_node (操作節點)
think_role_user (使用者和使用者分組的對應)
think_access (各個操作和使用者組的對應)
這裡重點說一下 think_note
think_note 其實就是記錄下了整個網站操作對應的 專案名稱 模組名稱 和 操作名稱。
欄位name就是當專案,模組或者操作的名稱了。
欄位PID 記錄他們的從屬關係,比如某一個模組是屬於哪個專案,某個操作屬於哪個模組。
欄位level 表示該節點的層級 換句話就是說 level=1 為專案 ,level=2為模組 ,level=3就是操作了,比如說 admin專案,他的PID 就是 0 (專案的PID都是0) level就是1,nane就是admin了,ad min專案下面有的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添加參數,就是當前分組的名稱。 然後屬於某個分組的模組就引用這基類。 這樣就達到了同一專案下 分組管理模組的功能了。