首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

ThinkPHP RBAC 權限管理深度解析:核心類、資料表與實戰流程

     編輯:PHP 相關知識

前言

RBAC(Role-Based Access Control,基於角色的存取控制)是企業級應用權限管理的主流方案。ThinkPHP 內建 Rbac.class.php 提供開箱即用的實現。本文從核心方法、資料表設計、登入驗證流程三個維度深度解析,助你快速掌握 TP RBAC 精髓。

一、資料表結構設計

表名用途關鍵欄位
role角色表id, name, remark, status
role_user用戶-角色關聯role_id, user_id
node節點表(權限點)id, name, title, pid, level, module
access權限表role_id, node_id, level, module

關係說明: 用戶 ↔ 角色(多對多),角色 ↔ 節點(多對多),節點對應具體模組/控制器/方法。

二、Rbac 核心類方法詳解

位於 Lib/Org/Util/Rbac.class.php

1. saveAccessList($authId = null)

  • 觸發時機: 用戶登入成功後調用。
  • 核心邏輯: 讀取用戶角色 → 彙總角色擁有的節點 → 存入 $_SESSION['_ACCESS_LIST']。
  • 兩種例外不緩存:
    1. 超級管理員(需在登入時設定 $_SESSION[C('ADMIN_AUTH_KEY')])
    2. 開啟即時認證(C('USER_AUTH_ON') 且 C('AUTH_TYPE')=2),每次請求重新查庫。

2. checkAccess()

判斷當前訪問的模組/控制器/方法是否在「無需認證清單」(NOT_AUTH_MODULE)中,內部自動調用,開發者無需關心。

3. checkLogin()

檢查 $_SESSION[C('USER_AUTH_KEY')] 是否存在,未登入則跳轉至 C('LOGIN_URL')。

4. AccessDecision() —— 權限判斷核心

流程圖:
1. checkAccess() → 需認證?
   ├─ 否 → 放行
   └─ 是 → 是超級管理員?
         ├─ 是 → 放行
         └─ 否 → 即時認證?
               ├─ 是 → 重新 getAccessList() 查庫判斷
               └─ 否 → 從 $_SESSION['_ACCESS_LIST'] 讀取判斷

5. getAccessList($authId) —— 最關鍵方法

執行多表關聯 SQL,支援角色繼承(role.pid),但作者建議「放棄繼承功能,改用扁平化角色設計,擴展性更強」。

三、實戰接入流程

步驟 1:用戶登入時保存權限

public function login() {
    // ... 驗證帳密 ...
    $_SESSION[C('USER_AUTH_KEY')] = $user['id']; // 必須存 uid
    if ($user['is_admin']) {
        $_SESSION[C('ADMIN_AUTH_KEY')] = true;
    }
    Rbac::saveAccessList(); // 寫入快取
}

步驟 2:基類控制器自動驗證

class BaseController extends Controller {
    protected function _initialize() {
        // 1. 檢查登入
        if (!Rbac::checkLogin()) redirect(U('Public/login'));
        
        // 2. 檢查權限
        if (!Rbac::AccessDecision()) {
            if (IS_AJAX) $this->error('無權限操作');
            else $this->error('無權限訪問');
        }
    }
}

四、進階建議

  1. 閱讀源碼: 強烈建議通讀 Rbac.class.php 全文,理解 SQL 拼裝與快取策略。
  2. 節點自動掃描: 結合 BuildRbac 行為擴展,自動同步節點表,避免手動維護。
  3. 效能優化: 大型系統建議關閉即時認證,改用 Redis 快取 _ACCESS_LIST,並提供「清除權限快取」後台按鈕。
  4. API 場景: 無狀態 API 改用 JWT + RBAC 權限載荷,不依賴 Session。

結語

ThinkPHP RBAC 以「約定優於配置」降低接入門檻,核心在於 saveAccessList 快取與 AccessDecision 判斷雙引擎。掌握資料表關係、例外機制、即時/快取兩種模式,即可靈活應對大多數業務場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved