可能是史上最全的許可權系統設計

来源:https://www.cnblogs.com/iceblow/archive/2019/07/12/11121362.html
-Advertisement-
Play Games

許可權系統設計 前言 許可權管理是所有後臺系統的都會涉及的一個重要組成部分,主要目的是對不同的人訪問資源進行許可權的控制,避免因許可權控制缺失或操作不當引發的風險問題,如操作錯誤,隱私數據泄露等問題。 目前在公司負責許可權這塊,所以對許可權這塊的設計比較熟悉,公司採用微服務架構,許可權系統自然就獨立出來了,其他業 ...


許可權系統設計

前言

許可權管理是所有後臺系統的都會涉及的一個重要組成部分,主要目的是對不同的人訪問資源進行許可權的控制,避免因許可權控制缺失或操作不當引發的風險問題,如操作錯誤,隱私數據泄露等問題。
目前在公司負責許可權這塊,所以對許可權這塊的設計比較熟悉,公司採用微服務架構,許可權系統自然就獨立出來了,其他業務系統包括商品中心,訂單中心,用戶中心,倉庫系統,小程式,多個APP等十幾個系統和終端

1.許可權模型

迄今為止最為普及的許可權設計模型是RBAC模型,基於角色的訪問控制(Role-Based Access Control)

1.1 RBAC0模型

RBAC0模型如下:

這是許可權最基礎也是最核心的模型,它包括用戶/角色/許可權,其中用戶和角色是多對多的關係,角色和許可權也是多對多的關係。
用戶是發起操作的主體,按類型分可分為2B和2C用戶,可以是後臺管理系統的用戶,可以是OA系統的內部員工,也可以是面向C端的用戶,比如阿裡雲的用戶。
角色起到了橋梁的作用,連接了用戶和許可權的關係,每個角色可以關聯多個許可權,同時一個用戶關聯多個角色,那麼這個用戶就有了多個角色的多個許可權。有人會問了為什麼用戶不直接關聯許可權呢?在用戶基數小的系統,比如20個人的小系統,管理員可以直接把用戶和許可權關聯,工作量並不大,選擇一個用戶勾選下需要的許可權就完事了。但是在實際企業系統中,用戶基數比較大,其中很多人的許可權都是一樣的,就是個普通訪問許可權,如果管理員給100人甚至更多授權,工作量巨大。這就引入了"角色(Role)"概念,一個角色可以與多個用戶關聯,管理員只需要把該角色賦予用戶,那麼用戶就有了該角色下的所有許可權,這樣設計既提升了效率,也有很大的拓展性。
許可權是用戶可以訪問的資源,包括頁面許可權,操作許可權,數據許可權:

  • 頁面許可權: 即用戶登錄系統可以看到的頁面,由菜單來控制,菜單包括一級菜單和二級菜單,只要用戶有一級和二級菜單的許可權,那麼用戶就可以訪問頁面
  • 操作許可權: 即頁面的功能按鈕,包括查看,新增,修改,刪除,審核等,用戶點擊刪除按鈕時,後臺會校驗用戶角色下的所有許可權是否包含該刪除許可權,如果是,就可以進行下一步操作,反之提示無許可權。有的系統要求"可見即可操作",意思是如果頁面上能夠看到操作按鈕,那麼用戶就可以操作,要實現此需求,這裡就需要前端來配合,前端開發把用戶的許可權信息緩存,在頁面判斷用戶是否包含此許可權,如果有,就顯示該按鈕,如果沒有,就隱藏該按鈕。某種程度上提升了用戶體驗,但是在實際場景可自行選擇是否需要這樣做
  • 數據許可權: 數據許可權就是用戶在同一頁面看到的數據是不同的,比如財務部只能看到其部門下的用戶數據,採購部只看採購部的數據,在一些大型的公司,全國有很多城市和分公司,比如杭州用戶登錄系統只能看到杭州的數據,上海用戶只能看到上海的數據,解決方案一般是把數據和具體的組織架構關聯起來,舉個例子,再給用戶授權的時候,用戶選擇某個角色同時綁定組織如財務部或者合肥分公司,那麼該用戶就有了該角色下財務部或合肥分公司下的的數據許可權。

以上是RBAC的核心設計及模型分析,此模型也叫做RBAC0,而基於核心概念之上,RBAC還提供了擴展模式。包括RBAC1,RBAC2,RBAC3模型。下麵介紹這三種類型

1.2 RBAC1模型

此模型引入了角色繼承(Hierarchical Role)概念,即角色具有上下級的關係,角色間的繼承關係可分為一般繼承關係和受限繼承關係。一般繼承關係僅要求角色繼承關係是一個絕對偏序關係,允許角色間的多繼承。而受限繼承關係則進一步要求角色繼承關係是一個樹結構,實現角色間的單繼承。這種設計可以給角色分組和分層,一定程度簡化了許可權管理工作。

1.3 RBAC2模型

基於核心模型的基礎上,進行了角色的約束控制,RBAC2模型中添加了責任分離關係,其規定了許可權被賦予角色時,或角色被賦予用戶時,以及當用戶在某一時刻激活一個角色時所應遵循的強制性規則。責任分離包括靜態責任分離和動態責任分離。主要包括以下約束:

  • 互斥角色: 同一用戶只能分配到一組互斥角色集合中至多一個角色,支持責任分離的原則。互斥角色是指各自許可權互相制約的兩個角色。比如財務部有會計和審核員兩個角色,他們是互斥角色,那麼用戶不能同時擁有這兩個角色,體現了職責分離原則
  • 基數約束: 一個角色被分配的用戶數量受限;一個用戶可擁有的角色數目受限;同樣一個角色對應的訪問許可權數目也應受限,以控制高級許可權在系統中的分配
  • 先決條件角色: 即用戶想獲得某上級角色,必須先獲得其下一級的角色

1.4 RBAC3模型

即最全面的許可權管理,它是基於RBAC0,將RBAC1和RBAC2進行了整合

1.5 用戶組

當平臺用戶基數增大,角色類型增多時,而且有一部分人具有相同的屬性,比如財務部的所有員工,如果直接給用戶分配角色,管理員的工作量就會很大,如果把相同屬性的用戶歸類到某用戶組,那麼管理員直接給用戶組分配角色,用戶組裡的每個用戶即可擁有該角色,以後其他用戶加入用戶組後,即可自動獲取用戶組的所有角色,退出用戶組,同時也撤銷了用戶組下的角色,無須管理員手動管理角色。
根據用戶組是否有上下級關係,可以分為有上下級的用戶組和普通用戶組:

  • 具有上下級關係的用戶組: 最典型的例子就是部門和職位,可能多數人沒有把部門職位和用戶組關聯起來吧。當然用戶組是可以拓展的,部門和職位常用於內部的管理系統,如果是面向C端的系統,比如淘寶網的商家,商家自身也有一套組織架構,比如採購部,銷售部,客服部,後勤部等,有些人擁有客服許可權,有些人擁有上架許可權等等,所以用戶組是可以拓展的
  • 普通用戶組: 即沒有上下級關係,和組織架構,職位都沒有關係,也就是說可以跨部門,跨職位,舉個例子,某電商後臺管理系統,有拼團活動管理角色,我們可以設置一個拼團用戶組,該組可以包括研發部的後臺開發人員,運營部的運營人員,採購部的人員等等。

每個公司都會涉及到到組織和職位,下麵就重點介紹這兩個。

1.5.1 組織

常見的組織架構如下圖:

我們可以把組織與角色進行關聯,用戶加入組織後,就會自動獲得該組織的全部角色,無須管理員手動授予,大大減少工作量,同時用戶在調崗時,只需調整組織,角色即可批量調整。組織的另外一個作用是控制數據許可權,把角色關聯到組織,那麼該角色只能看到該組織下的數據許可權。

1.5.2 職位

假設財務部的職位如下圖:

每個組織部門下都會有多個職位,比如財務部有總監,會計,出納等職位,雖然都在同一部門,但是每個職位的許可權是不同的,職位高的擁有更多的許可權。總監擁有所有許可權,會計和出納擁有部分許可權。特殊情況下,一個人可能身兼多職。

1.6 含有組織/職位/用戶組的模型

根據以上場景,新的許可權模型就可以設計出來了,如下圖:

根據系統的複雜度不同,其中的多對多關係和一對一關係可能會有變化,

  • 在單系統且用戶類型單一的情況下,用戶和組織是一對一關係,組織和職位是一對多關係,用戶和職位是一對一關係,組織和角色是一對一關係,職位和角色是一對一關係,用戶和用戶組是多對對關係,用戶組和角色是一對一關係,當然這些關係也可以根據具體業務進行調整。模型設計並不是死的,如果小系統不需要用戶組,這塊是可以去掉的。
  • 分散式系統且用戶類型單一的情況下,到這裡許可權系統就會變得很複雜,這裡就要引入了一個"系統"概念,此時系統架構是個分散式系統,許可權系統獨立出來,負責所有的系統的許可權控制,其他業務系統比如商品中心,訂單中心,用戶中心,每個系統都有自己的角色和許可權,那麼許可權系統就可以配置其他系統的角色和許可權。
  • 分散式系統且用戶類型多個的情況下,比如淘寶網,它的用戶類型包括內部用戶,商家,普通用戶,內部用戶登錄多個後臺管理系統,商家登錄商家中心,這些做許可權控制,如果你作為架構師,該如何來設計呢?大神可以在評論區留言交流哦!

2.授權流程

授權即給用戶授予角色,按流程可分為手動授權和審批授權。許可權中心可同時配置這兩種,可提高授權的靈活性。

  • 手動授權: 管理員登錄許可權中心為用戶授權,根據在哪個頁面授權分為兩種方式:給用戶添加角色,給角色添加用戶。給用戶添加角色就是在用戶管理頁面,點擊某個用戶去授予角色,可以一次為用戶添加多個角色;給角色添加用戶就是在角色管理頁面,點擊某個角色,選擇多個用戶,實現了給批量用戶授予角色的目的。
  • 審批授權: 即用戶申請某個職位角色,那麼用戶通過OA流程申請該角色,然後由上級審批,該用戶即可擁有該角色,不需要系統管理員手動授予。

3.表結構

有了上述的許可權模型,設計表結構就不難了,下麵是多系統下的表結構,簡單設計下,主要提供思路:

4.許可權框架

  • Apache Shrio
  • Spring Security

在項目中可以採用其中一種框架,它們的優缺點以及如何使用會在後面的文章中詳細介紹.

5.結語

許可權系統可以說是整個系統中最基礎,同時也可以很複雜的,在實際項目中,會遇到多個系統,多個用戶類型,多個使用場景,這就需要具體問題具體分析,但最核心的RBAC模型是不變的,我們可以在其基礎上進行擴展來滿足需求。
最後,如果您覺得這篇文章對您有幫助,可以點個贊,謝謝支持!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.如何理解 JS 中的this關鍵字? JS 初學者總是對this關鍵字感到困惑,因為與其他現代編程語言相比,JS 中的這this關鍵字有點棘手。 “this” 一般是表示當前所在的對象,但是事情並沒有像它應該的那樣發生。JS中的this關鍵字由函數的調用者決定,誰調用就this就指向哪個。如果找 ...
  • 1、what? 垃圾回收:js代碼想要運行,需要操作系統或者運行時提供記憶體空間,來存儲變數及它的值。在某些變數(例如局部變數)在不參與運行時,就需要系統回收被占用的記憶體空間,稱為垃圾回收 記憶體泄漏:某些情況下,不再用到的變數所占記憶體沒有及時釋放,導致程式運行中,記憶體越占越大,極端情況下可導致系統崩潰 ...
  • 最近在面試的時候,遇到過兩次問繼承實現的幾種方式,這裡能我給大家列舉了以下的這幾種,給大家參考參考 方式一:藉助構造函數實現繼承 這裡使用的原理就是在Child裡面,把Parent的this指向改為是Child的this指向,從而實現繼承 缺點:只能解決屬性的繼承,使用屬性的值不重覆,但是父級類別的 ...
  • 摘要: 高效使用Set! 作者:前端小智 原文: "如何使用 Set 來提高代碼的性能" "Fundebug" 經授權轉載,版權歸原作者所有。 為了保證的可讀性,本文采用意譯而非直譯。 我確信有很多開發人員堅持使用基本的全局對象:數字,字元串,對象,數組和布爾值。對於許多用例,這些都是需要的。 但是 ...
  • 恢復內容開始 這篇文章很長,但的確是一篇非常乾的乾貨,講訴了 HTML、JavaScript、CSS、jQuery使用的一些規範與建議,前端的同學可以認真閱讀此文,並比較自己平時的一些習慣,看是否有改進的地方…… HTML 咋的啦,DOCTYPE? 不定義DOCTYPE是一種可以被判死刑的罪行。 以 ...
  • 對象的擴展運算符(...),用於取出參數對象中的所有可遍歷屬性,然後拷貝到當前對象之中 對象擴展運算符: 1. 複製對象 let obj1 = { x: 1, y: 2, z: 3 } let obj2 = { ...obj1 } obj2 = { x: 1, y: 2, z: 3 } 2. 合併對 ...
  • 前端開發要學的知識內容涉及的會很寬泛,雖然說主要是HTML、CSS和JavaScript這些基礎知識點,但達妹今天想強調一下,學前端開發除了要學這些基礎知識外,學員還要在這之上進行延伸和深入的去學,而且互聯網時代不斷發展,掌握了這些新技術、新技能,在職場的競爭力必然會翻倍提升。 就前端開發要怎麼學的 ...
  • 除了核心功能預設內置的指令 (v-model 和 v-show),Vue 也允許註冊自定義指令。 官網介紹的比較抽象,顯得很高大上,我個人對自定義指令的理解是:當自定義指令作用在一些DOM元素或組件上時,該元素在初次渲染、插入到父節點、更新、解綁時可以執行一些特定的操作(鉤子函數() 自定義指令有兩 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...