詳解 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 部署前端
- 線上訪問