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

ThinkPHP 實現 RBAC 權限控制:從傳統 ACL 到角色基礎存取控制核心原理

     編輯:PHP 相關知識

RBAC 核心概念

RBAC(Role-Based Access Control):基於角色的存取控制。不直接將權限指派給使用者,而是:

  1. 定義角色(如:超級管理員、編輯、審核、客服)。
  2. 將權限(操作動作:增/刪/改/查、模組存取)指派給角色。
  3. 將使用者指派給一個或多個角色。

使用者權限 = 其所屬角色權限的聯集。人員異動時只需調整角色指派,權限自動生效。

傳統 ACL vs RBAC 對比

維度傳統 ACL(使用者-權限直接綁定)RBAC(角色中介)
新增使用者需逐一勾選數十項權限,易遺漏/錯誤選擇預定角色(如「編輯」),秒級完成
權限調整逐個使用者修改,大量帳號極其繁瑣修改角色權限,所有隸屬使用者即時生效
離職/轉崗需清理個人權限殘留移除角色指派或改派新角色
權限稽核難以追蹤「誰有什麼權限」清晰:角色→權限、使用者→角色
適用規模極小系統(<10 人、<20 權限點)中大型系統、多部門、多層級組織

ThinkPHP 實作 RBAC 關鍵資料表設計

-- 角色表
CREATE TABLE think_role (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL COMMENT '角色標識',
    title VARCHAR(50) COMMENT '角色顯示名',
    status TINYINT DEFAULT 1,
    remark VARCHAR(255)
);

-- 節點/權限表(對應控制器/方法)
CREATE TABLE think_node (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL COMMENT '節點名稱(如 User/add)',
    title VARCHAR(50) COMMENT '顯示名稱',
    pid INT DEFAULT 0 COMMENT '父節點(模組/控制器層級)',
    level TINYINT DEFAULT 1 COMMENT '層級:1模組 2控制器 3方法',
    status TINYINT DEFAULT 1,
    sort INT DEFAULT 0
);

-- 角色-節點關聯表
CREATE TABLE think_access (
    role_id INT NOT NULL,
    node_id INT NOT NULL,
    level TINYINT NOT NULL,
    module VARCHAR(50),
    PRIMARY KEY (role_id, node_id)
);

-- 使用者-角色關聯表
CREATE TABLE think_role_user (
    role_id INT NOT NULL,
    user_id INT NOT NULL,
    PRIMARY KEY (role_id, user_id)
);

ThinkPHP 內建 RBAC 類別使用流程

  1. 配置開啟:config.php 設定 'RBAC_SUPERADMIN' => 'admin'(超管帳號)、'ADMIN_AUTH_KEY' => 'userId'。
  2. 引入 Rbac 類別:import('ORG.Util.Rbac');(ThinkPHP 3.x)或使用 5.x 社群擴充套件。
  3. 登入時建立權限快取:
// 登入成功後
Rbac::saveAccessList($userId); // 將用戶所有權限節點寫入 Session/快取
  1. 控制器基類驗證:
class CommonController extends Controller {
    protected function _initialize() {
        if (!Rbac::AccessDecision()) {
            $this->error('無權限存取');
        }
    }
}
// 業務控制器繼承 CommonController 即自動受保護
  1. 視圖層動態顯示選單:
{{-- 模板中 --}}
{volist name="__MENU__" id="vo"}
    {if condition="Rbac::checkAccess($vo['name'])"}
        <a href="{:U($vo['name'])}">{$vo['title']}</a>
    {/if}
{/volist}

進階:動態選單與按鈕級權限

  • 後台管理介面提供「角色管理」「節點管理」「權限分配」介面。
  • 節點自動掃描:掃描 Controller 類別的 public 方法自動生成節點記錄。
  • 按鈕級控制:{if condition="Rbac::checkAccess('User/delete')"}<button>刪除</button>{/if}。

最佳實踐建議

  1. 節點命名規範:模組/控制器/方法(如 Admin/User/add),對應路由結構。
  2. 超級管理員繞過檢查:配置 RBAC_SUPERADMIN,程式碼首行判斷直接返回 true。
  3. 快取策略:權限變更頻率低,登入時寫入 Redis/檔案快取,請求時直接讀取,避免每請求查庫。
  4. API 權限:同樣節點體系,中介層驗證 Token 後呼叫 Rbac::checkAccess()。
  5. 資料權限(行級):RBAC 僅解決功能權限,資料範圍(如:只能看自己部門訂單)需結合「資料範圍規則」或「策略模式」實作。

結語

RBAC 透過「角色」解耦「使用者」與「權限」,是中大型系統權限管理的標準解法。ThinkPHP 內建/社群擴充套件提供開箱即用的實作,關鍵在於節點設計規範化、快取策略正確、視圖層動態渲染三大落地細節。

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