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;