一、什么是RBAC
基于角色的訪問控制(Role-Based Access Control)作為傳統訪問控制(自主訪問,強制訪問)的有前景的代替受到廣泛的關注。
在RBAC中,權限與角色相關聯,用戶通過成為適當角色的成員而得到這些角色的權限。這就極大地簡化了權限的管理。
在一個組織中,角色是為了完成各種工作而創造,用戶則依據它的責任和資格來被指派相應的角色,用戶可以很容易地從一個角色被指派到另一個角色。角色可依新的需求和系統的合并而賦予新的權限,而權限也可根據需要而從某角色中回收。角色與角色的關系可以建立起來以囊括更廣泛的客觀情況。
二、ThinkPHP中的RBAC
先看下官方給的實例所用到的數據表,通過5張表實現權限控制,定義如下:
RBAC 要用到5個數據表
think_user (用戶表)
think_role (用戶分組表)
think_node (操作節點)
think_role_user (用戶和用戶分組的對應)
think_access (各個操作和用戶組的對應)
角色表,有哪些角色,該角色與對應的userid用戶相關聯
三、config配置文件詳解
我們看看thinkphp官方示例中的config文件:
復制代碼 代碼如下:
array(
'APP_AUTOLOAD_PATH'=>'@.TagLib',
'SESSION_AUTO_START'=>true,
'USER_AUTH_ON'=>true,
'USER_AUTH_TYPE'=>1,// 默認認證類型 1 登錄認證 2 實時認證
'USER_AUTH_KEY'=>'authId', // 用戶認證SESSION標記
'ADMIN_AUTH_KEY'=>'administrator',
'USER_AUTH_MODEL'=>'User', // 默認驗證數據表模型
'AUTH_PWD_ENCODER'=>'md5', // 用戶認證密碼加密方式
'USER_AUTH_GATEWAY'=>'/Public/login',// 默認認證網關
'NOT_AUTH_MODULE'=>'Public', // 默認無需認證模塊
'REQUIRE_AUTH_MODULE'=>'',// 默認需要認證模塊
'NOT_AUTH_ACTION'=>'',// 默認無需認證操作
'REQUIRE_AUTH_ACTION'=>'',// 默認需要認證操作
'GUEST_AUTH_ON'=>false, // 是否開啟游客授權訪問
'GUEST_AUTH_ID'=>0,// 游客的用戶ID
'DB_LIKE_FIELDS'=>'title|remark',
'RBAC_ROLE_TABLE'=>'think_role',
'RBAC_USER_TABLE'=>'think_role_user',
'RBAC_ACCESS_TABLE'=>'think_access',
'RBAC_NODE_TABLE'=>'think_node',
'SHOW_PAGE_TRACE'=>1//顯示調試信息
);
四、RBAC類的幾個重要的方法
authenticate($map,$model=”)方法 傳入查詢用戶的條件和用戶表的MODEL 返回數組包含用戶的信息
saveAccessList($authId=null)方法 傳入用戶的ID 此方法不返回值,只是設置 $_SESSION['_ACCESS_LIST']的值,其中包含了所有該用戶對應的用戶組的有權限操作的所有節點 $_SESSION['_ACCESS_LIST']['項目名']['模塊名']['操作名'],以后判斷權限就是判斷當前項目,模塊和操作是否在 $_SESSION['_ACCESS_LIST']中能找到。
checkAccess() 方法 檢測當前模塊和操作是否需要驗證 返回bool類型
checkLogin()方法 檢測登錄
AccessDecision($appName=APP_NAME) 方法 就是檢測當前項目模塊操作 是否在$_SESSION['_ACCESS_LIST']數組中,也就是說 在 $_SESSION['_ACCESS_LIST'] 數組中$_SESSION['_ACCESS_LIST']['當前操作']['當前模塊']['當前操作']是否存在。如果存在表示有權限 否則返回flase。
getAccessList($authId) 方法 通過查詢數據庫 返回權限列表 $_SESSION['_ACCESS_LIST']的值了。
新聞熱點
疑難解答