Springboot 集成 RBAC 模型實戰指南

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) │└──────┬────────┘│┌──────▼────────┐│  業務邏輯處理  │└───────────────┘

權限驗證流程

  1. 請求攔截FilterSecurityInterceptor` 攔截受保護請求
  2. 身份提取:從 SecurityContext` 獲取已認證的用戶信息
  3. 元數據匹配:將請求 URL/Method 與 SecurityMetadataSource` 中的規則匹配
  4. 權限決策:調用 AccessDecisionManager` 對比用戶權限與資源所需權限
  5. 訪問控制:通過則繼續執行,否則拋出 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校驗請關注后續文章更新

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80023.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80023.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80023.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何收集用戶白屏/長時間無響應/接口超時問題

想象一下這樣的場景:一位用戶在午休時間打開某電商應用,準備購買一件心儀已久的商品。然而,頁面加載了數秒后依然是一片空白,或者點擊“加入購物車”按鈕后沒有任何反饋,甚至在結算時接口超時導致訂單失敗。用戶的耐心被迅速消耗殆盡,關閉應用,轉而選擇了競爭對手的產品…

用戶需求報告、系統需求規格說明書、軟件需求規格說明的對比分析

用戶需求報告、系統需求規格說明書&#xff08;SyRS&#xff09;和軟件需求規格說明書&#xff08;SRS&#xff09;是需求工程中的關鍵文檔&#xff0c;分別對應不同層次和視角的需求描述。以下是它們的核心區別對比&#xff1a; ??1. 用戶需求報告&#xff08;User Requirem…

iostat指令介紹

文章目錄 1. 功能介紹2. 語法介紹3. 應用場景4. 示例分析 1. 功能介紹 iostat (input/output statistics)&#xff0c;是 Linux/Unix 系統中用于監控 CPU 使用率和 磁盤 I/O 性能的核心工具&#xff0c;可實時展示設備負載、吞吐量、隊列狀態等關鍵指標。 可以使用 man iostat查…

神經網絡 “疑難雜癥” 破解指南:梯度消失與爆炸全攻略(六)

引言 在神經網絡的發展歷程中&#xff0c;梯度消失和梯度爆炸如同兩座難以翻越的大山&#xff0c;阻礙著深層神經網絡發揮其強大的潛力。尤其是在處理復雜任務時&#xff0c;這兩個問題可能導致模型訓練陷入困境&#xff0c;無法達到預期的效果。本文將深入探討梯度消失和梯度…

“多模態SCA+DevSecOps+SBOM風險情報預警 “數字供應鏈安全最佳管理體系!懸鏡安全如何用AI守護萬億數字中國?

夜深人靜&#xff0c;程序員青絲盯著屏幕上自動生成的代碼模塊陷入沉思。在AI大模型的加持下&#xff0c;僅用一周團隊就完成了原本需要半年的開發進度&#xff0c;但代碼審查時卻發現了不少高危漏洞。“生成效率提升了&#xff0c;但安全漏洞像定時炸彈一樣藏在代碼里”&#…

Node.js簡介(nvm使用)

Node.js是一個基于Chrome V8 JavaScript引擎構建的開源、跨平臺JavaScript運行環境。它允許開發者在服務器端運行JavaScript代碼&#xff0c;從而實現前后端統一的開發語言。Node.js具有事件驅動、非阻塞I/O模型&#xff0c;使其非常適合于構建高性能的網絡應用。 Node.js不是…

PHP日志會對服務器產生哪些影響?

PHP日志是服務器運維中非常重要的一部分&#xff0c;但處理不當會對服務器產生明顯的負面影響。下面我們從多個維度深入分析&#xff1a;PHP日志的作用、類型、對服務器的正面與負面影響&#xff0c;以及優化建議&#xff0c;讓你全面掌握這一問題。 一、PHP日志是什么? PHP…

Spring AI Alibaba-02-多輪對話記憶、持久化消息記錄

Spring AI Alibaba-02-多輪對話記憶、持久化消息記錄 Lison <dreamlison163.com>, v1.0.0, 2025.04.19 文章目錄 Spring AI Alibaba-02-多輪對話記憶、持久化消息記錄多輪對話對話持久-Redis 本次主要聚焦于多輪對話功能的實現&#xff0c;后續會逐步增加更多實用內容&…

分別配置Github,Gitee的SSH鏈接

文章目錄 前言一、為第二個賬號生成新的密鑰對二、 配置 SSH config 文件1.引入庫使用 Host 別名進行 clone/push/pull注意擴展 前言 之前已經在電腦配置過Github一個倉庫ssh鏈接&#xff0c;今天想配一個Gitee倉庫的ssh鏈接。運行 ssh-keygen -t rsa提示已經存在&#xff0c…

Python 獲取淘寶買家訂單詳情(buyer_order_detail)接口的詳細指南

在電商運營中&#xff0c;訂單詳情數據是商家進行數據分析、客戶服務和營銷策略制定的重要依據。淘寶提供了 buyer_order_detail 接口&#xff0c;允許開發者獲取買家的訂單詳情數據。本文將詳細介紹如何使用 Python 調用該接口獲取訂單詳情&#xff0c;并解析返回的數據。 一、…

C語言實戰:用Pygame打造高難度水果消消樂游戲

水果消消樂 - 困難模式 以下是一個基于Python和Pygame的水果消消樂游戲實現&#xff0c;包含困難模式的特點&#xff1a; import pygame import random import sys from pygame.locals import *# 初始化 pygame.init() pygame.mixer.init()# 游戲常量 FPS 60 WINDOW_WIDTH …

Doris-BrokerLoad任務監控

BrokeLoad監控 #!/bin/bash target_label$1 user$2 password$3looptrue echo "開始循環了----------------------" while ${loop} dolabel$(mysql -h FE_IP -P9030 -urealtime -ppassword -D offline -e "show load where label${target_label}")if [ -z &…

企業微信私域運營,基于http協議實現SCRM+AI完整解決方案

1、方案介紹 基于企業微信原生功能已實現全場景的能力覆蓋&#xff0c;并提供標準化可直接調用的API接口&#xff0c;可以幫助企業輕松實現上層應用的開發及落地&#xff0c;方案采用模擬通信技術可實現PC&#xff0c;手機&#xff0c;ipad三端的同時在線&#xff0c;單服務器…

Oracle Linux8 安裝 MySQL 8.4.3,搭建一主一從

文章目錄 安裝依賴獲取安裝包解壓準備相關目錄設置配置文件啟動數據庫連接數據庫socket 文件優化同樣方法準備 3307 數據庫實例設置配置文件啟動 3307 實例數據庫連接并查看 3307 數據庫實例基于 bin log 搭建主從模式 安裝依賴 yum install -y numactl libaio ncurses-compat…

Dataway在Spring Boot中的引入以及使用教程

Dataway是Hasor生態中的接口配置工具&#xff0c;能幫助開發者快速配置數據接口。它支持DataQL和SQL兩種語言模式&#xff0c;可將SQL轉換為DataQL執行&#xff0c;簡化數據查詢與交互&#xff0c;無需編寫大量代碼。接口配置完成后&#xff0c;可進行自測、冒煙測試&#xff0…

進程互斥的軟件實現方法

單標志法 算法思想&#xff1a;兩個進程在訪問完臨界區后會把使用臨界區的權限轉交給另一個進程。也就是說每個進程進入臨界區的權限只能被另一個進程賦予 int turn 0; //turn 表示當前允許進入臨界區的進程號P0 進程&#xff1a; while (turn ! 0); ① //進入區 critical …

力扣150題-- 匯總區間和合并區間

Day 27 題目描述 思路 做法&#xff1a; 特殊處理空數組和數組只有一個元素的情況設置beg&#xff0c;end標記范圍的起始和結束&#xff0c;x用來比較元素是否有序&#xff08;初始end和beg都指向nums[0[,x為nums[0]1&#xff09;遍歷數組如果當前元素等于x&#xff0c;說明…

【c++深入系列】:萬字string詳解(附有sso優化版本的string模擬實現源碼)

&#x1f525; 本文專欄&#xff1a;c &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 當你想放棄時&#xff0c;想想為什么當初堅持走到了這里 ★★★ 本文前置知識&#xff1a; 類和對象&#xff08;上&#xff09; 類和對…

Spark-Streaming簡介和核心編程

Spark-Streaming簡介 概述&#xff1a;用于流式數據處理&#xff0c;支持Kafka、Flume等多種數據輸入源&#xff0c;可使用Spark原語運算&#xff0c;結果能保存到HDFS、數據庫等。它以DStream&#xff08;離散化流&#xff09;為抽象表示&#xff0c;是RDD在實時場景的封裝&am…

verilog中的約束信息

1、保持約束 keep&#xff1a;當編譯器在對FPGA設計進行映射時&#xff0c;一些線網將會被吸收到邏輯塊中。 (* KEEP "{TRUE | FALSE}" *) keep_hierarchy:vivado默認會把設計變成一級一級模塊化的調用轉換為一個沒有子模塊的超大模塊。這個約束會保留部分層級關系…