如何設計一個權限系統

2021-02-13 網際網路後端架構
權限系統設計前言

權限管理是所有後臺系統的都會涉及的一個重要組成部分,主要目的是對不同的人訪問資源進行權限的控制,避免因權限控制缺失或操作不當引發的風險問題,如操作錯誤,隱私數據洩露等問題。

1.權限模型

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

1.1 RBAC-0模型

RBAC-0模型

RBAC-0模型是權限最基礎也是最核心的模型,它包括用戶/角色/權限,其中用戶和角色是多對多的關係,角色和權限也是多對多的關係。

用戶 是發起操作的主體,按類型分可分為2B和2C用戶,可以是後臺管理系統的用戶,可以是OA系統的內部員工,也可以是面向C端的用戶,比如阿里雲的用戶。

角色 起到了橋梁的作用,連接了用戶和權限的關係,每個角色可以關聯多個權限,同時一個用戶關聯多個角色,那麼這個用戶就有了多個角色的多個權限。

有人會問了為什麼用戶不直接關聯權限呢?在用戶基數小的系統,比如20個人的小系統,管理員可以直接把用戶和權限關聯,工作量並不大,選擇一個用戶勾選下需要的權限就完事了。

但是在實際企業系統中,用戶基數比較大,其中很多人的權限都是一樣的,就是個普通訪問權限,如果管理員給100人甚至更多授權,工作量巨大。

這就引入了 "角色(Role)" 概念,一個角色可以與多個用戶關聯,管理員只需要把該角色賦予用戶,那麼用戶就有了該角色下的所有權限,這樣設計既提升了效率,也有很大的拓展性。

權限 是用戶可以訪問的資源,包括頁面權限,操作權限,數據權限:

頁面權限: 即用戶登錄系統可以看到的頁面,由菜單來控制,菜單包括一級菜單和二級菜單,只要用戶有一級和二級菜單的權限,那麼用戶就可以訪問頁面

操作權限: 即頁面的功能按鈕,包括查看,新增,修改,刪除,審核等,用戶點擊刪除按鈕時,後臺會校驗用戶角色下的所有權限是否包含該刪除權限。如果是,就可以進行下一步操作,反之提示無權限。有的系統要求"可見即可操作",意思是如果頁面上能夠看到操作按鈕,那麼用戶就可以操作,要實現此需求,這裡就需要前端來配合,前端開發把用戶的權限信息緩存,在頁面判斷用戶是否包含此權限,如果有,就顯示該按鈕,如果沒有,就隱藏該按鈕。某種程度上提升了用戶體驗,但是在實際場景可自行選擇是否需要這樣做

數據權限: 數據權限就是用戶在同一頁面看到的數據是不同的,比如財務部只能看到其部門下的用戶數據,採購部只看採購部的數據。在一些大型的公司,全國有很多城市和分公司,比如杭州用戶登錄系統只能看到杭州的數據,上海用戶只能看到上海的數據,解決方案一般是把數據和具體的組織架構關聯起來。

舉個例子,再給用戶授權的時候,用戶選擇某個角色同時綁定組織如財務部或者合肥分公司,那麼該用戶就有了該角色下財務部或合肥分公司下的的數據權限。

用戶、角色及權限

以上是RBAC的核心設計及模型分析,此模型也叫做RBAC-0,而基於核心概念之上,RBAC還提供了擴展模式。包括RBAC-1,RBAC-2,RBAC-3模型。下面介紹這三種類型

1.2 RBAC-1模型

image

此模型引入了角色繼承(Hierarchical Role)概念,即角色具有上下級的關係,角色間的繼承關係可分為一般繼承關係和受限繼承關係。

一般繼承關係僅要求角色繼承關係是一個絕對偏序關係,允許角色間的多繼承。

而受限繼承關係則進一步要求角色繼承關係是一個樹結構,實現角色間的單繼承。這種設計可以給角色分組和分層,一定程度簡化了權限管理工作。

1.3 RBAC-2模型

基於核心模型的基礎上,進行了角色的約束控制,RBAC2模型中添加了責任分離關係。

其規定了權限被賦予角色時,或角色被賦予用戶時,以及當用戶在某一時刻激活一個角色時所應遵循的強制性規則。

責任分離包括靜態責任分離和動態責任分離。主要包括以下約束:

互斥角色: 同一用戶只能分配到一組互斥角色集合中至多一個角色,支持責任分離的原則。互斥角色是指各自權限互相制約的兩個角色。比如財務部有會計和審核員兩個角色,他們是互斥角色,那麼用戶不能同時擁有這兩個角色,體現了職責分離原則

基數約束: 一個角色被分配的用戶數量受限;一個用戶可擁有的角色數目受限;同樣一個角色對應的訪問權限數目也應受限,以控制高級權限在系統中的分配

先決條件角色: 即用戶想獲得某上級角色,必須先獲得其下一級的角色

1.4 RBAC-3模型

即最全面的權限管理,它是基於RBAC-0,將RBAC-1和RBAC-2進行了整合。

1.5 用戶組

當平臺用戶基數增大,角色類型增多時,而且有一部分人具有相同的屬性,比如財務部的所有員工,如果直接給用戶分配角色,管理員的工作量就會很大。

如果把相同屬性的用戶歸類到某用戶組,那麼管理員直接給用戶組分配角色,用戶組裡的每個用戶即可擁有該角色,以後其他用戶加入用戶組後,即可自動獲取用戶組的所有角色,退出用戶組,同時也撤銷了用戶組下的角色,無須管理員手動管理角色。

根據用戶組是否有上下級關係,可以分為有上下級的用戶組和普通用戶組:

具有上下級關係的用戶組: 最典型的例子就是部門和職位,可能多數人沒有把部門職位和用戶組關聯起來吧。當然用戶組是可以拓展的,部門和職位常用於內部的管理系統,如果是面向C端的系統。比如淘寶網的商家,商家自身也有一套組織架構,比如採購部,銷售部,客服部,後勤部等,有些人擁有客服權限,有些人擁有上架權限等等,所以用戶組是可以拓展的

普通用戶組: 即沒有上下級關係,和組織架構,職位都沒有關係,也就是說可以跨部門,跨職位。舉個例子,某電商後臺管理系統,有拼團活動管理角色,我們可以設置一個拼團用戶組,該組可以包括研發部的後臺開發人員,運營部的運營人員,採購部的人員等等。

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

1.5.1 組織

常見的組織架構如

我們可以把組織與角色進行關聯,用戶加入組織後,就會自動獲得該組織的全部角色,無須管理員手動授予,大大減少工作量,同時用戶在調崗時,只需調整組織,角色即可批量調整。

組織的另外一個作用是控制數據權限,把角色關聯到組織,那麼該角色只能看到該組織下的數據權限。

1.5.2 職位

假設財務部的職位

每個組織部門下都會有多個職位,比如財務部有總監,會計,出納等職位,雖然都在同一部門,但是每個職位的權限是不同的,職位高的擁有更多的權限。

總監擁有所有權限,會計和出納擁有部分權限。特殊情況下,一個人可能身兼多職。

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

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

組織/職位/用戶組

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

在單系統且用戶類型單一的情況下,用戶和組織是一對一關係,組織和職位是一對多關係,用戶和職位是一對一關係,組織和角色是一對一關係,職位和角色是一對一關係,用戶和用戶組是多對對關係,用戶組和角色是一對一關係,當然這些關係也可以根據具體業務進行調整。模型設計並不是死的,如果小系統不需要用戶組,這塊是可以去掉的。

分布式系統且用戶類型單一的情況下,到這裡權限系統就會變得很複雜,這裡就要引入了一個"系統"概念。此時系統架構是個分布式系統,權限系統獨立出來,負責所有的系統的權限控制,其他業務系統比如商品中心,訂單中心,用戶中心,每個系統都有自己的角色和權限,那麼權限系統就可以配置其他系統的角色和權限。

分布式系統且用戶類型多個的情況下,比如淘寶網,它的用戶類型包括內部用戶,商家,普通用戶,內部用戶登錄多個後臺管理系統,商家登錄商家中心,這些做權限控制,如果你作為架構師,該如何來設計呢?大神可以在評論區留言交流哦!

2.授權流程

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

手動授權: 管理員登錄權限中心為用戶授權,根據在哪個頁面授權分為兩種方式:給用戶添加角色,給角色添加用戶。給用戶添加角色就是在用戶管理頁面,點擊某個用戶去授予角色,可以一次為用戶添加多個角色;給角色添加用戶就是在角色管理頁面,點擊某個角色,選擇多個用戶,實現了給批量用戶授予角色的目的。

**審批授權: **即用戶申請某個職位角色,那麼用戶通過OA流程申請該角色,然後由上級審批,該用戶即可擁有該角色,不需要系統管理員手動授予。

3.表結構

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

image

4.權限框架

Apache Shrio

Spring Security

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

5.結語

權限系統可以說是整個系統中最基礎,同時也可以很複雜的,在實際項目中,會遇到多個系統,多個用戶類型,多個使用場景,這就需要具體問題具體分析,但最核心的RBAC模型是不變的,我們可以在其基礎上進行擴展來滿足需求。

相關焦點

  • RBAC權限系統分析、設計與實現
    轉載請備註來源:《RBAC權限系統分析、設計與實現》 | shuwoom.com
  • 手把手教你做系統權限設計,看完不要說還不會
    權限系統設計前言權限管理是所有後臺系統的都會涉及的一個重要組成部分,主要目的是對不同的人訪問資源進行權限的控制,避免因權限控制缺失或操作不當引發的風險問題
  • 一個很酷的後臺權限管理系統
    上一篇:如何設計一個高性能網關
  • 如何在 Linux 中配置 sudo 訪問權限
    sudo 是一個程序,普通用戶可以使用它以超級用戶或其他用戶的身份執行命令,是由安全策略指定的。sudo 用戶的訪問權限是由 /etc/sudoers 文件控制的。sudo 用戶有什麼優點?在 Linux 系統中,如果你不熟悉一個命令,sudo 是運行它的一個安全方式。
  • 聊聊Android的系統權限
    不給權限就不讓使用,可見某寶對這些權限是多麼的饑渴,它拿到這些權限能幹些什麼呢,今天就來聊聊Android的系統權限。到目前為止,Android系統提供了135種奇奇怪怪的權限,一個應用想要獲得一些敏感信息或者特殊操作,就需要向系統申請對應的權限,這些權限在安裝應用的時候會顯示在系統的安裝嚮導界面上。
  • win10如何刪除有TrustedInstaller權限的文件?
    當我們在使用win10系統,系統內存滿的時候,我們需要清理內存釋放系統空間來提高電腦運行速度。
  • 如何關閉Windows電腦中的無用服務+如何解除WIN10管理員權限
    如何關閉滑鼠右擊「我的電腦」,選擇「管理」。找到「服務和應用程式」並展開,然後雙擊「服務」,就能看到電腦中的所有服務都在裡面。上面介紹了如何關閉電腦服務的方法,但不是所有的服務都能關閉,某些服務關閉後會造成某些功能無法使用。
  • Win7/8/10如何獲得管理員權限的簡單解決方法
    win10系統下的C盤我們可能不經常去使用,但是有需要的話我們一般是沒有權限在系統文件夾下複製或者刪除的,會提示您需要提供管理員權限才能複製到此文件夾的類似提示
  • 如何設計無焦系統
    這篇文章介紹了如何在OpticStudio中對無焦系統 (Afocal System) 進行優化和設計。其中重點討論了什麼是無焦系統,如何在角度單位下分析無焦系統,如何處理柱面無焦系統以及如何處理具有多個聚焦和無焦空間的系統。
  • Win10系統QQ遠程控制提示「QQ遠程系統權限原因,暫時無法操作」的解決方法
    系統,使用QQ遠程桌面控制對方電腦的時候,在操作的時候可能會出現「QQ遠程系統權限原因,暫時無法操作」的提示,導致了無法進行操作,但是被控端電腦是Win7基本不會有這樣的問題。對於對方電腦是Win10系統,那麼遇到這個問題,我們要如何解決呢?下面裝機之家分享一下Win10提示「QQ遠程系統權限原因,暫時無法操作」的解決方法。根據QQ提示的「QQ遠程系統權限原因,暫時無法操作」,從字面上來看,無疑是用戶權限導致的這個問題,被控端的系統用戶不是最高權限,Win10安全性相對要高一些,如果想要解決這個問題無疑需要將被控端電腦設置最高用戶權限。
  • win10有一個隱藏的超級管理員帳戶,擁有全部權限,如何啟用它
    ~Windows10內置一個超級管理員帳戶,但是默認情況下,出於安全原因,它是隱藏和禁用的,啟用或禁用它的方法如下。在Windows 10安裝結束時,Windows安裝程序會提示你創建一個用戶帳戶,這是系統上的主帳戶,默認配置為管理員帳戶。儘管Windows將管理員用戶狀態授予了此帳戶,而且它擁有幾乎所有的管理權限。
  • RBAC 模型權限管理的應用
    權限管理個人理解是在系統設計基礎和底層,有了權限管理才能更好分清責任和崗位的關係;更好地把控系統帶來各種風險,也更好地使系統運作;目前權限管理分為 兩大類別:功能權限、數據權限。,所以要有批判性思維,辯證看待問題,不能看見什麼就設計什麼,這樣就成工具人,無意義。
  • 門禁系統設計方案
    傳統的方法是工作人員對出入人員進行登記放行,這種方法費事、費力又容易出錯,而且管理不嚴格。因而智能、安全、高效的現代化門禁管理已經成為社會發展的必然趨勢,同時它也是現代化智能建築的一個重要組成部分。可以進行軟體強制性操作,例如您在辦公室裡正進行秘密重大的協商或電話,不想被人打擾,您可以通過軟體的功能強制門關閉,這樣即使授權的持卡人員也無法進入,進行完畢後,您可以通過軟體恢復系統正常。可以實時監控門的狀態和感應卡執卡者的出入狀況,並可以比較顯示照片,避免非法持有者冒充進入。
  • win10系統怎麼取得完美管理員權限
    一些應用的打開需要有管理員權限,那麼大家知道win10系統怎麼樣才能取得完美管理員權限嗎
  • Win7/8/10系統獲取管理員權限方法
    可能大家都有遇到過訪問或刪除某個文件夾提示需要管理員權限的問題,今天就給大家介紹一下怎麼獲取管理員權限。
  • 什麼是架構 | 企業系統的架構設計方法
    3、有什麼方法來幫助我們理解複雜的系統?4、如何進行系統分析?5、架構設計的本質是什麼?6、如何進行架構設計?7、如何進行業務領域建模?8、模型如何推導出架構設計?9、架構設計需要遵循哪些規範?系統思維目標:系統思維首先是高效的理解分析現存的系統,對系統重構做好理論指導基礎。這一節介紹了設計一個系統需要經歷哪些重要的環節,並且強調了謀求利益是系統設計的核心訴求。然後通過登陸火星這項任務把一個龐大的工程變成了可理解的獨立步驟,並且還有模有樣的畫出了架構圖,體現了對業務建模到架構輸出的流程。下面章節我們將會展開來介紹一套核心的方法論,如何破局系統架構設計。
  • 關於Android6.0系統動態權限管理的解決方案(精品)
    隨著Android 5.X系統的普及,目前手機都在已經升級到了Android 6.0,那麼
  • Linux 權限入門指南 | Linux 中國
    與其他系統相比而言 Linux 系統的眾多優點中最為主要一個便是 Linux 系統有著更少的安全漏洞和被攻擊的隱患。
  • 如何設計實時數據平臺(下篇)
    RTDP的敏捷之路就此展開~回顧上篇(設計篇)請戳這裡:如何設計實時數據平臺(上篇)在設計篇中,我們給出了RTDP的一個整體架構設計(圖1)。之所以要引入這樣一個組件,是為了Kafka的消費方能夠了解不同Topic上流轉的是哪些數據,以及數據的元數據信息,並進行有效的解析消費。任何數據流轉鏈路,不管是在什麼系統上流轉,都會存在這段數據鏈路的元數據管理問題,Kafka也不例外。
  • Linux權限控制的基本原理
    這裡,我們主要介紹 Linux 系統中,權限控制的基本原理。在 Linux 系統中,我們所有的操作實質都是在進行進程訪問文件的操作。我們訪問文件需要先取得相應的訪問權限,而訪問權限是通過 Linux 系統中的安全模型獲得的。