從0實現RBAC許可權模型

語言: CN / TW / HK

theme: vuepress

詳解 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-開發環境準備

  1. jdk 說明以及安裝
  2. gradle 說明和安裝配置
  3. vscode 外掛推薦

2-初始化 SpringBoot

  1. 初始化 spring-boot 專案,啟動
  2. 在 vscode 開啟除錯模式,檢視除錯資訊

3-Web

  1. 新增 web 依賴,啟動
  2. 新增根路由介面,啟動,瀏覽器訪問

4-詳解 RBAC

  1. 分析 RBAC 的資料結構
  2. 分析詳細的使用方法

5-JPA 和 Mysql

  1. 建立本地資料庫
  2. 新增 JPA 和 MySQL 依賴,並且成功啟動
  3. 設計具體的 Entity
  4. 啟動,檢視資料庫

6-API 設計

  1. 設計 Restful API 介面
  2. 介面規範相關

7-API 實現

  1. 實現 Controller 層
  2. 新增 API 說明文件

8-Repo 和 Service

  1. JpaRepository
  2. Service
  3. 角色和使用者的 Controller

9-Security

  1. 新增 Security,訪問介面
  2. 登入,訪問介面
  3. 完成登入許可權認證
  4. 登入介面
  5. 新增 jjwt 依賴

10-Security 驗證和處理

  1. 新增最新的 Security 配置
  2. 登入過程
  3. 認證過程
  4. 介面許可權認證過程
  5. 新增測試使用者資料
  6. 登入、測試介面許可權

11-多對多關係

  1. lazy 查詢
  2. 解決迴圈引用問題
  3. 搭配前端聯調

12-部署

  1. 在 heroku 建立應用和資料庫
  2. 部署應用
  3. 在 vercel 部署前端
  4. 線上訪問