RBAC 模型核心原理
詳情可參考之前的筆記:https://blog.csdn.net/qq_35201802/article/details/146036789?spm=1011.2415.3001.5331
RBAC 定義與優勢
RBAC(Role-Based Access Control,基于角色的訪問控制)** 是一種通過角色關聯用戶和權限的權限管理模型。其核心思想是將權限分配給角色,再將角色授予用戶,從而解耦用戶與權限的直接關系。
核心優勢:
- 靈活性,權限變更只需調整角色,無需逐個修改用戶。
- 可維護性,通過角色層級和約束規則實現復雜權限場景。
- 最小權限原則,用戶僅擁有完成工作所需的最小權限集。
Spring Boot 集成 RBAC 實現原理
技術架構
┌───────────────┐│ 客戶端請求 │└──────┬────────┘│┌──────▼────────┐│ Spring Security 過濾器鏈 │└──────┬────────┘│┌──────▼────────┐│ 身份認證 (Authentication) │└──────┬────────┘│┌──────▼────────┐│ 權限驗證 (Authorization) │└──────┬────────┘│┌──────▼────────┐│ 業務邏輯處理 │└───────────────┘
權限驗證流程
- 請求攔截:FilterSecurityInterceptor` 攔截受保護請求
- 身份提取:從 SecurityContext` 獲取已認證的用戶信息
- 元數據匹配:將請求 URL/Method 與 SecurityMetadataSource` 中的規則匹配
- 權限決策:調用 AccessDecisionManager` 對比用戶權限與資源所需權限
- 訪問控制:通過則繼續執行,否則拋出 AccessDeniedException`
Spring Boot 實戰實現
數據庫設計
-- `user`.tb_user definitionCREATE TABLE `tb_user` (`id` int NOT NULL AUTO_INCREMENT COMMENT '用戶 ID(主鍵)',`user_id` varchar(50) NOT NULL COMMENT '用戶編號',`username` varchar(50) NOT NULL COMMENT '用戶名',`password` varchar(255) NOT NULL COMMENT '密碼',`email` varchar(100) NOT NULL COMMENT '郵箱',`status` tinyint DEFAULT '1' COMMENT '狀態:1-啟用, 0-禁用',`is_deleted` tinyint DEFAULT '0' COMMENT '刪除標志:0-未刪除, 1-已刪除',`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`create_by` int DEFAULT NULL COMMENT '創建人 ID(關聯 tb_user.user_id)',`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',`update_by` int DEFAULT NULL COMMENT '修改人 ID(關聯 tb_user.user_id)',PRIMARY KEY (`id`),UNIQUE KEY `user_id` (`user_id`),UNIQUE KEY `username` (`username`),UNIQUE KEY `email` (`email`),UNIQUE KEY `user_id_2` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用戶表';-- `user`.tb_role definitionCREATE TABLE `tb_role` (`id` int NOT NULL AUTO_INCREMENT COMMENT '角色 ID(主鍵)',`role_id` varchar(50) NOT NULL COMMENT '角色編號',`role_name` varchar(50) NOT NULL COMMENT '角色名稱',`role_description` varchar(500) DEFAULT NULL COMMENT '角色描述',`is_deleted` tinyint DEFAULT '0' COMMENT '刪除標志:0-未刪除, 1-已刪除',`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`create_by` int DEFAULT NULL COMMENT '創建人 ID(關聯 tb_user.user_id)',`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',`update_by` int DEFAULT NULL COMMENT '修改人 ID(關聯 tb_user.user_id)',PRIMARY KEY (`id`),UNIQUE KEY `role_id` (`role_id`),UNIQUE KEY `role_name` (`role_name`),UNIQUE KEY `role_id_2` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色表';-- `user`.tb_permission definitionCREATE TABLE `tb_permission` (`id` int NOT NULL AUTO_INCREMENT COMMENT '權限 ID(主鍵)',`permission_id` varchar(100) NOT NULL COMMENT '權限編號',`permission_name` varchar(100) NOT NULL COMMENT '權限標識(如 user:read)',`permission_desc` varchar(500) DEFAULT NULL COMMENT '權限描述',`is_deleted` tinyint DEFAULT '0' COMMENT '刪除標志:0-未刪除, 1-已刪除',`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`create_by` int DEFAULT NULL COMMENT '創建人 ID(關聯 tb_user.user_id)',`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',`update_by` int DEFAULT NULL COMMENT '修改人 ID(關聯 tb_user.user_id)',PRIMARY KEY (`id`),UNIQUE KEY `permission_id` (`permission_id`),UNIQUE KEY `permission_name` (`permission_name`),UNIQUE KEY `permission_id_2` (`permission_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='權限表';-- `user`.tb_user_role definitionCREATE TABLE `tb_user_role` (`id` int NOT NULL AUTO_INCREMENT COMMENT '用戶角色 ID(主鍵)',`user_role_id` varchar(100) NOT NULL COMMENT '用戶角色編號',`user_id` varchar(100) NOT NULL COMMENT '用戶 ID(關聯 tb_user.user_id)',`role_id` varchar(100) NOT NULL COMMENT '角色 ID(關聯 tb_role.role_id)',PRIMARY KEY (`id`),UNIQUE KEY `user_id` (`user_id`,`role_id`),UNIQUE KEY `user_role_id` (`user_role_id`),KEY `role_id` (`role_id`),CONSTRAINT `tb_user_role_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `tb_user` (`user_id`) ON DELETE CASCADE,CONSTRAINT `tb_user_role_ibfk_2` FOREIGN KEY (`role_id`) REFERENCES `tb_role` (`role_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用戶角色關聯表';-- `user`.tb_role_permission definitionCREATE TABLE `tb_role_permission` (`id` int NOT NULL AUTO_INCREMENT COMMENT '角色權限 ID(主鍵)',`role_permission_id` varchar(100) NOT NULL COMMENT '角色權限編號',`role_id` varchar(100) NOT NULL COMMENT '角色 ID(關聯 tb_role.role_id)',`permission_id` varchar(100) NOT NULL COMMENT '權限 ID(關聯 tb_permission.permission_id)',PRIMARY KEY (`id`),UNIQUE KEY `role_id` (`role_id`,`permission_id`),UNIQUE KEY `role_permission_id` (`role_permission_id`),KEY `permission_id` (`permission_id`),CONSTRAINT `tb_role_permission_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `tb_role` (`role_id`) ON DELETE CASCADE,CONSTRAINT `tb_role_permission_ibfk_2` FOREIGN KEY (`permission_id`) REFERENCES `tb_permission` (`permission_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色權限關聯表';
角色權限配置接口設計
用戶
public interface UserService {void saveUser(UserReq req);UserVO getUser(UserReq req);void updateUser(UserReq req);void deleteUser(UserReq req);PageVO<UserVO> pageUser(UserReq req);void addRole(UserRoleReq req);
}
角色
public interface RoleService {void saveRole(RoleReq req);void updateRole(RoleReq req);void deleteRole(RoleReq req);RoleVO getRole(RoleReq req);PageVO<RoleVO> pageRole(RoleReq req);void addPermission(RolePermissionReq req);
}
權限
public interface PermissionService {void savePermission(PermissionReq req);void updatePermission(PermissionReq req);void deletePermission(PermissionReq req);PermissionVO getPermission(PermissionReq req);PageVO<PermissionVO> pagePermission(PermissionReq req);
}
總結
本篇主要對 Springboot 集成 RBAC 模型設計進行梳理,關鍵點在于用戶與權限解耦,通過角色關聯權限,其他邏輯的實現,比如接口的權限校驗,tooken校驗請關注后續文章更新