基於角色的訪問控制(Role-Based Access Control)node
在RBAC中,權限與角色相關聯,用戶經過成爲適當角色的成員而獲得這些角色的權限。數據庫
ThinkPHP經過5張表實現權限控制數組
think_user (用戶表)app
think_role (用戶分組表)加密
think_node (操做節點)spa
think_role_user (用戶和用戶分組的對應)3d
think_access (各個操做和用戶組的對應)調試
認證過程code
1.判斷當前模塊的當前操做是否須要認證
2.若是須要認證而且還沒有登陸,跳到認證網關,若是已經登陸 執行5
3.經過委託認證進行用戶身份認證
4.獲取用戶的決策訪問列表
5.判斷當前用戶是否具備訪問權限
配置config文件blog
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 //顯示調試信息 );
注:
Public模塊是無需認證的
默認網關地址就是認證失敗,沒有權限跳轉到此處,從新登錄
ADMIN_AUTH_KEY表示超級管理員權限,不用分配權限,它什麼權限都有
重要的方法:
authenticate($map,$model=」) 傳入查詢用戶的條件和用戶表的MODEL 返回數組包含用戶的信息
saveAccessList($authId=null) 傳入用戶的ID,無返回值,只是設置 $_SESSION[‘_ACCESS_LIST’]的值
checkAccess() 檢測當前模塊和操做是否須要驗證
checkLogin() 檢測登陸
AccessDecision($appName=APP_NAME) 檢測當前項目模塊操做 是否在$_SESSION[‘_ACCESS_LIST’]數組中
$_SESSION[‘_ACCESS_LIST’][‘當前操做’][‘當前模塊’][‘當前操做’]是否存在,存在,表示有權限
getAccessList($authId) 經過查詢數據庫 返回權限列表,$_SESSION[‘_ACCESS_LIST’]的值