如果你是一個TP的重度使用者的話,請自動略過筆者以下文字
權限管理我在成為一個開發者1年半內,接觸過2種,一種就是數學方式 比如我們文件夾權限的755這種權限管理的方式,這種二進制的權限管理的方式 無恥得引入 http://www.cnblogs.com/qfcndtt/archive/2012/08/03/2621713.html這裡講解的也比較詳細,不過這種方式適合於權限節點相對較少的系統。也很輕便。
下面正式開始THINKPHP的RBAC的講解
在系統目錄下的Librar/Org/Util目錄下的Rbac.class.php
在config中
擁有著RBAC的相關的配置文件
數據庫的話,我以我現在的一個系統為例
角色表 role
用戶對應的角色表 role_user
節點表 node
權限表 access
先解析下Rbac中擁有的比較重要的方法
saveAccessList($authId=null)
這裡保存可以傳空值的前提是 你在用戶登錄操作的時候要在 $_SESSION[C('USER_AUTH_KEY')] 中把用戶的uid保存下來,然後這裡會將用戶所對應的角色擁有的權限都保存在$_SESSION['_ACCESS_LIST']中。 有2中例外是不保存的,一個是管理員用戶(這個用戶比較特殊所以需要在管理員登錄的時候指定一個$_SESSION[C('ADMIN_AUTH_KEY')]) 一個是開啟了實時認證 (實時認證他是不保存權限的每次權限判斷的時候都會重新去獲取用戶的權限)
checkAccess()
這個是判斷用戶訪問的模塊和方法是否需要權限認證 (此方法內部調用的無需關心)
checkLogin()
該方法是判斷用戶是否登錄,如果未登錄則跳轉到指定路徑,正常的系統會跳到用戶登錄頁面
AccessDecision()
該方法可是這裡權限判斷的關鍵點,因為這個方法就是判斷用戶是否有訪問權限的,具體的邏輯是先去判斷是否需要權限認證(checkAccess),然後去看是否是管理員,如果不是管理員就看是否開啟了實時認證,如果開啟了,就再次去調取用戶的權限列表,然後去判斷訪問的權限是否在數組裡,如果沒開啟則直接從$_SESSION['_ACCESS_LIST']中讀取判斷。
getAccessList($authId)
這裡個人覺得才是這個類中的最為重要的方法。具體的話,筆者還是希望讀者自己去看下這裡的代碼,應該核心就是那幾個sql語句,做到了角色繼承,不過我做權限管理的話,還是把這個功能默認放棄了,覺得不太方便拓展。
/***********現在我講解下如何使用這個Rbac*************/
1:用戶登錄的情況下
用戶登錄成功後保存authId;判斷是否是管理員,然後調用saveAccessList去保存權限
2:用戶在訪問系統的時候我們要做權限判斷
先去判斷用戶是否登錄,如果未登錄跳回登錄頁面
然後去判斷用戶是否有訪問的權限,如果沒有則給定ajax或者頁面訪問的報錯方式
看吧就是這麼簡單,不過我還是建議用戶尤其是經常使用tp的開發者,多去看下這些方法的源代碼,畢竟讀源代碼對於個人的提升是很大的。