博客 / 詳情

返回

從0實現RBAC權限模型

詳解 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. 在線訪問
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.