詳解 RBAC
基於角色的訪問控制(Role-based access control),指的是通過用户的角色(Role)授權其相關權限,這實現了更靈活的訪問控制,相比直接授予用户權限,要更加簡單、高效、可擴展。
當使用 RBAC 時,通過分析系統用户的實際情況,基於共同的職責和需求,授予他們不同角色。你可以授予給用户一個或多個角色,每個角色具有一個或多個權限,這種 用户-角色、角色-權限 間的關係,讓我們可以不用再單獨管理單個用户,用户從授予的角色裏面繼承所需的權限。
以一個簡單的場景(Gitlab 的權限系統)為例,用户系統中有 Admin、Maintainer、Operator 三種角色,這三種角色分別具備不同的權限,比如只有 Admin 具備創建代碼倉庫、刪除代碼倉庫的權限,其他的角色都不具備。
我們授予某個用户「Admin」這個角色,他就具備了「創建代碼倉庫」和「刪除代碼倉庫」這兩個權限。
不直接給用户授權策略,是為了之後的擴展性考慮。比如存在多個用户擁有相同的權限,在分配的時候就要分別為這幾個用户指定相同的權限,修改時也要為這幾個用户的權限進行一一修改。有了角色後,我們只需要為該角色制定好權限後,給不同的用户分配不同的角色,後續只需要修改角色的權限,就能自動修改角色內所有用户的權限。
比如説,我們準備一個代碼審查的角色,只允許查看代碼,那麼我們只需要添加一個角色“代碼審查”,並且賦予其代碼查看的權限即可,非常的方便。
要實現 RBAC 模型,一般需要以下實體:
用户
User
基礎單位,所有的用户都存儲在這裏
角色
Role
給相應用户配置對應的角色,和用户是多對多的關係
權限
Permission
權限屬於最小的控制判斷依據,給對應的角色配置對應的權限,這樣擁有此權限的用户就可以訪問對應的資源,和角色是多對多的關係
實體關係説明
多對多的關係,需要有一箇中間表維護關係, User 和 Role 的中間表 User-Role , Role 和 Permission 需要中間表 Role-Permission
場景舉例
下面來分析兩個具體的應用場景:
現有一個管理系統,簡單的分為管理員和普通用户兩種角色,管理員具有一些管理權限,但是沒有具體業務的權限
新增角色
這時候需要新增一個角色,主要工作是查看用户的所有反饋,類似於客服的角色,這時候我們只要新增一個角色,並把這個角色配置給某個用户就好了
新增權限
業務需求,可以給某個用户實施凍結帳户操作,這時候直接添加一個權限,並配置到管理員即可
在線體驗
使用分支的方式,展示在 vscode 中完成一個 SpringBoot 的 RBAC 鑑權服務的具體過程,可以用來當做一些後台系統的基礎模板,可以一步一步的按照順序結合分支代碼進行嘗試
在線文檔
在線體驗
| 用户 | 帳户 | 密碼 |
|---|---|---|
| 管理員 | admin | password |
| 普通用户 | normal | password |
後端源碼 關鍵詞:spring-boot jpa gradle
前端源碼 關鍵詞:vue3 composition vite pinia eslint lint-staged commitlint
具體過程
1-開發環境準備
- jdk 説明以及安裝
- gradle 説明和安裝配置
- vscode 插件推薦
2-初始化 SpringBoot
- 初始化 spring-boot 項目,啓動
- 在 vscode 打開調試模式,查看調試信息
3-Web
- 添加 web 依賴,啓動
- 添加根路由接口,啓動,瀏覽器訪問
4-詳解 RBAC
- 分析 RBAC 的數據結構
- 分析詳細的使用方法
5-JPA 和 Mysql
- 創建本地數據庫
- 添加 JPA 和 MySQL 依賴,並且成功啓動
- 設計具體的 Entity
- 啓動,查看數據庫
6-API 設計
- 設計 Restful API 接口
- 接口規範相關
7-API 實現
- 實現 Controller 層
- 添加 API 説明文檔
8-Repo 和 Service
- JpaRepository
- Service
- 角色和用户的 Controller
9-Security
- 添加 Security,訪問接口
- 登錄,訪問接口
- 完成登錄權限認證
- 登錄接口
- 添加 jjwt 依賴
10-Security 驗證和處理
- 添加最新的 Security 配置
- 登錄過程
- 認證過程
- 接口權限認證過程
- 添加測試用户數據
- 登錄、測試接口權限
11-多對多關係
- lazy 查詢
- 解決循環引用問題
- 搭配前端聯調
12-部署
- 在 heroku 創建應用和數據庫
- 部署應用
- 在 vercel 部署前端
- 在線訪問