B/S 系統中權限控制是安全基石。不同於 C/S 可靠客戶端攔截,B/S 必須在服務端構建完整的基於角色的訪問控制 (RBAC) 模型。本文深度解析一套經典的權限管理系統數據庫設計,採用三實體表 + 兩映射表 + 一分欄表 結構,實現「組」授權、動態菜單、跨系統復用,附帶完整 ER 邏輯、關鍵查詢與擴展策略。
核心需求分析
- 職責隔離: 不同崗位擁有差異化操作權限。
- 組授權: 權限分配給「組」,用戶歸屬組,避免逐人配置。
- 跨系統復用: 權限模型作為獨立組件,可插拔接入任意 MIS 系統。
- 功能權限與資源權限分離: 功能權限 (菜單/按鈕) 可復用,資源權限 (數據範圍) 業務專屬。
- 動態菜單分欄: 左側導航欄按權限分組動態渲染。
數據庫 ER 設計 (六表核心)
三大實體表
| 表名 | 邏輯名 | 核心字段 | 業務含義 |
action | 權限表 | id (PK), action (UK), description, actioncolumnid (FK) | 系統中最小操作單元 (如「用戶新增」、「報表導出」),action 為業務唯一鍵,永不變更 |
groupmanager | 管理組表 | groupid (PK), groupname, description | 角色/組定義 (如「超級管理員」、「財務組」) |
master | 人員表 | id (PK), username, password, realname, email | 系統用戶/管理員 |
兩大映射表 (解決多對多)
| 表名 | 邏輯名 | 核心字段 | 映射關係 |
actiongroup | 權限映射表 | groupid (FK), action (FK→action.action) | 組 ↔ 權限:一組擁有多權限,一權限屬於多組 |
mastergroup | 人員映射表 | masterid (FK), groupid (FK) | 人 ↔ 組:一人歸屬多組,一組包含多人 |
關鍵設計決策: actiongroup 使用 action (業務代碼) 而非 action.id (代理鍵) 關聯 action 表。因 id 可能因重構/遷移變更,導致映射失效;action 為業務標識,生命週期穩定,保證映射永不失效。
一分欄表 (動態菜單渲染)
| 表名 | 邏輯名 | 核心字段 | 作用 |
actioncolumn | 權限分欄表 | actioncolumnid (PK), columnname, displayorder | 左側菜單一級分組 (如「系統管理」、「業務查詢」、「報表中心」),action 通過 actioncolumnid 歸屬分欄 |
核心業務查詢邏輯
1. 獲取用戶所有有效權限 (登錄時加載)
SELECT DISTINCT a.action, a.description, a.actioncolumnid
FROM master m
JOIN mastergroup mg ON m.id = mg.masterid
JOIN actiongroup ag ON mg.groupid = ag.groupid
JOIN action a ON ag.action = a.action
WHERE m.username = @CurrentUser;
2. 獲取用戶菜單分欄結構 (前端渲染)
SELECT ac.actioncolumnid, ac.columnname, ac.displayorder,
a.action, a.description
FROM actioncolumn ac
JOIN action a ON ac.actioncolumnid = a.actioncolumnid
JOIN actiongroup ag ON a.action = ag.action
JOIN mastergroup mg ON ag.groupid = mg.groupid
JOIN master m ON mg.masterid = m.id
WHERE m.username = @CurrentUser
ORDER BY ac.displayorder, a.action;
3. 權限檢查點 (頁面/按鈕級攔截)
-- 應用層緩存用戶權限集合 (Set userActions)
IF @RequestedAction IN (userActions)
ALLOW;
ELSE
DENY; -- 403 或友好提示
為何此設計實現「可擴展/可復用」
| 維度 | 設計特徵 | 復用價值 |
| 結構不變 | 三實體 (權限/組/人) 為任何業務系統不變元素 | 新系統無需建表,僅導入數據 |
| 關係外置 | 兩映射表純記錄關係,無業務邏輯 | 關係變更僅增刪改數據,零代碼修改 |
| 分欄配置化 | 菜單結構數據驅動,非硬編碼 | 調整導航結構只改 actioncolumn 數據 |
| 業務鍵映射 | actiongroup 用 action 非 id 關聯 | 跨環境部署 (開發/測試/生產) ID 不一致也能正常工作 |
擴展策略:應對複雜業務演進
- 資源級權限 (數據範圍): 新增
resource_permission 表 (masterid, resource_type, resource_id, permission_level),獨立於功能權限體系。
- 組織架構同步: 引入
department, position 表,mastergroup 增加 dept_id, position_id 支援按部門/崗位批量授權。
- 臨時授權/委派:
actiongroup / mastergroup 增加 valid_from, valid_to, delegated_from_masterid 字段。
- 審計日誌: 記錄
permission_audit_log (operator, target_user, action, old_value, new_value, timestamp)。
- 微服務化拆分: 權限服務獨立部署,提供 gRPC/REST API (
CheckPermission(user, action), GetUserMenus(user)),各業務服務調用。
總結
此權限模型以 action (權限)、groupmanager (組)、master (人) 三實體為核心骨架,actiongroup、mastergroup 兩映射表編織動態關係網,actioncolumn 賦予前端渲染語義。其精髓在於:結構固化業務不變量,數據驅動業務變量,業務鍵保護映射穩定性。將此六表結構封裝為獨立「權限組件庫」(含遷移腳本、API SDK、管理後台),即可在任意 MIS 專案中實現零開發接入、分鐘級上線 的企業級權限體系。