RBAC(Role-Based Access Control,基於角色的訪問控制)是企業級應用權限管理的標準方案,核心邏輯是 “用户-角色-權限-資源” 的四層關聯模型。
RBAC 核心模型
RBAC 的核心是通過中間表解耦用户、角色、權限、資源的直接關聯,確保權限粒度可靈活控制:
- 用户(User):系統操作者(如 admin、普通用户);
- 角色(Role):權限的集合(如 管理員、編輯、訪客);
- 權限(Permission):具體操作權限(如 新增用户、查詢訂單、刪除文章);
- 資源(Resource):被保護的系統資源(如 接口 URL、菜單、按鈕)。
關聯關係:
- 用户 ↔ 角色:多對多(一個用户可擁有多個角色,一個角色可分配給多個用户);
- 角色 ↔ 權限:多對多(一個角色可包含多個權限,一個權限可分配給多個角色);
- 權限 ↔ 資源:一對一 / 多對一(一個權限對應一個資源,如 “查詢訂單” 對應 /api/orders 接口)。
數據庫設計
基於四層模型設計 5 張核心表(含關聯表),支持細粒度權限控制:
- 用户表(sys_user),存儲用户基礎信息(登錄憑證、狀態)
CREATE TABLE `sys_user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` varchar(50) NOT NULL COMMENT '用户名(唯一)',
`password` varchar(100) NOT NULL COMMENT 'BCrypt加密後的密碼',
`nickname` varchar(50) DEFAULT NULL COMMENT '暱稱',
`enabled` tinyint NOT NULL DEFAULT '1' COMMENT '是否啓用(1=啓用,0=禁用)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 角色表(sys_role),存儲角色信息
CREATE TABLE `sys_role` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '角色ID',
`role_code` varchar(50) NOT NULL COMMENT '角色編碼(如 ROLE_ADMIN,唯一)',
`role_name` varchar(50) NOT NULL COMMENT '角色名稱(如 管理員)',
`role_desc` varchar(100) DEFAULT NULL COMMENT '角色描述',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '狀態(1=正常,0=禁用)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_role_code` (`role_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 權限表(sys_permission),存儲具體權限(關聯資源,控制細粒度操作)
CREATE TABLE `sys_permission` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '權限ID',
`perm_code` varchar(50) NOT NULL COMMENT '權限編碼(如 USER_ADD,唯一)',
`perm_name` varchar(50) NOT NULL COMMENT '權限名稱(如 新增用户)',
`resource_type` varchar(20) NOT NULL COMMENT '資源類型(API=接口,MENU=菜單,BUTTON=按鈕)',
`resource_path` varchar(255) NOT NULL COMMENT '資源路徑(如 /api/users,菜單URL,按鈕ID)',
`request_method` varchar(10) DEFAULT NULL COMMENT '請求方法(GET/POST/PUT/DELETE,僅API資源有效)',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '狀態(1=正常,0=禁用)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_perm_code` (`perm_code`),
KEY `idx_resource` (`resource_path`, `request_method`) -- 優化資源權限查詢
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 用户 - 角色關聯表(sys_user_role),解耦用户與角色的多對多關係
CREATE TABLE `sys_role_permission` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '關聯ID',
`role_id` bigint NOT NULL COMMENT '角色ID',
`perm_id` bigint NOT NULL COMMENT '權限ID',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_role_perm` (`role_id`, `perm_id`), -- 避免重複關聯
CONSTRAINT `fk_rp_role_id` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_rp_perm_id` FOREIGN KEY (`perm_id`) REFERENCES `sys_permission` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;