首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

通用權限管理數據庫設計:從 RBAC 到「主體-領域-操作」極簡模型

     編輯:MySQL 綜合教學

傳統 RBAC 的擴展痛點

經典「用戶-角色-權限」模型在新增業務場景(模塊、菜單、按鈕、行級、列級…)時,需不斷添加關聯表(用戶-模塊、角色-菜單、用戶-按鈕…),導致表爆炸、查詢複雜、維護困難。

核心洞察:權限 = Who(主體) + What(領域) + How(操作)

  • 主體:用戶、角色、部門、組織…
  • 領域:模塊、菜單、頁面、按鈕、API、數據行/列…
  • 操作:可見、只讀、可用、分配、授權、禁用…

將六張關聯表**合併為單表 privilege**,以三元組唯一確定一條授權記錄。

極簡表結構

CREATE TABLE privilege (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  privilege_master VARCHAR(20) NOT NULL COMMENT '主體類型: USER/ROLE/DEPT',
  privilege_master_value BIGINT NOT NULL COMMENT '主體ID',
  privilege_access VARCHAR(20) NOT NULL COMMENT '領域類型: MENU/BUTTON/API/ROW/COL',
  privilege_access_value VARCHAR(100) NOT NULL COMMENT '領域編碼/ID',
  privilege_operation VARCHAR(20) NOT NULL COMMENT '操作: ENABLED/DISABLED/GRANT/DELEGATE',
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY uk_master_access_op (privilege_master, privilege_master_value, privilege_access, privilege_access_value, privilege_operation)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

實戰映射示例

業務場景privilege_masterprivilege_master_valueprivilege_accessprivilege_access_valueprivilege_operation
角色「銷售」可見「客戶管理」菜單ROLE1001MENUMNU_CUSTOMERENABLED
用戶 10001 可點擊「導出」按鈕USER10001BUTTONBTN_EXPORTENABLED
禁止用戶 10002 訪問「薪資」頁面USER10002MENUMNU_SALARYDISABLED
部門 200 可分配「報表」權限DEPT200API/api/report/*GRANT

查詢授權的統一邏輯

-- 判斷用戶是否有某操作權限(含角色繼承)
SELECT 1 FROM privilege
WHERE privilege_operation IN ('ENABLED','GRANT')
  AND privilege_access = 'BUTTON'
  AND privilege_access_value = 'BTN_DELETE'
  AND (
    (privilege_master = 'USER' AND privilege_master_value = ?)
    OR (privilege_master = 'ROLE' AND privilege_master_value IN (SELECT role_id FROM user_role WHERE user_id = ?))
    OR (privilege_master = 'DEPT' AND privilege_master_value IN (SELECT dept_id FROM user_dept WHERE user_id = ?))
  )
LIMIT 1;

擴展性演示

  • 新增「行級權限」:privilege_access='ROW', access_value='table:pk_value'
  • 新增「列級權限」:privilege_access='COL', access_value='table:column'
  • 新增「臨時授權/委派」:privilege_operation='DELEGATE' + 有效期字段

**零 DDL 變更**,僅應用層新增枚舉值即可支撐。

優勢總結

  1. 表結構固化:業務增長不加表,只有數據增長。
  2. 查詢統一:單表索引覆蓋,極速判權。
  3. 語義清晰:Who-What-How 直覺映射業務語言。
  4. 靈活組合:ENABLED/DISABLED 實現「白名單+黑名單」覆蓋邏輯。

工程落地提示

  • 應用層封裝 PermissionService.check(user, domain, operation) 統一入口
  • 緩存熱點授權(Redis Hash: perm:user:{uid}),變更時發布失效事件
  • 審計日誌記錄每次授權變更(誰給誰什麼權限)
  • 避免在 SQL 中硬編碼枚舉,使用常量類/字典表維護

一張表、三個維度、無限擴展——這才是權限模型的「終極簡潔」。

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