權限系統模型和常用權限框架

前言

權限管理一直是後臺系統中一個比較重要的東西,因爲一般會涉及到安全方面的問題。之前在公司老的授權系統上做了一個模塊的改造,算是體驗了一下授權系統是怎麼回事,但自己經驗不夠,也沒去了解基本模型,所以出去面試也被懟了,這裏補一下權限系統的基本模型,然後瞭解一下業界的常用權限框架。

RBAC0

RBAC是最爲普及的權限設計模型,全稱是Role-Based Access Control。這裏介紹的是最核心的模型,RBAC0,那麼這個模型分爲哪幾個部分呢?

avatar

上面就是RBAC0的模型圖了,他們之間都是多對多的關係,這個好理解。接下來闡述一下這其中的三個部分。

  • 用戶

    用戶就是操作的主體,可以這個系統的管理員,也可以使C端用戶,也可以內部員工,即可以簡單分爲2B和2C用戶。

  • 角色

    角色其實也好理解,比如一個系統有管理員和普通用戶兩種角色,管理員和普通用戶自然有着不同的權限。它是權限和用戶之間的橋樑,可以避免直接對用戶進行賦權操作,而是對用戶賦予某個角色,那麼這個用戶就有了這個角色下的所有權限,這樣方便之後拓展並且提交效率。每一個角色可以關聯多個權限,而一個用戶可以關聯多個角色,所以這樣一個用戶就有了多個角色的多個權限。

  • 權限

    權限就是用戶可以訪問的資源,具體可以分爲頁面權限,操作權限和數據權限。

    • 頁面權限,這個好理解,就是用戶登錄系統可以看到的頁面。
    • 操作權限,也就是包括增刪改查審批這樣的操作權限。
    • 數據權限,就是不同用戶在同一個界面看到的數據可能是不同的。

RBAC1

前面一般稱之爲RBAC0模型,RBAC1是在這個基礎上擴展來的,增加了角色的繼承概念,也就是角色這這裏具有了上下級的關係,談到繼承,那麼自然就有繼承關係的區分,RBAC1角色的繼承關係分爲一般繼承關係和受限繼承關係,一般繼承管理允許角色之間多繼承,而受限繼承關係進一步要求角色繼承關係必須是一個樹形結構。有了繼承,那麼比如A繼承了B,那麼A就自動有了B的權限,所以賦予給用戶的時候,就不需要再兩個都賦予一遍了。

RBAC2

RBAC2在用戶與角色之間和角色與角色之間做了一些約束,規定了權限被賦予角色的時候,或者角色被賦予用戶的時候,以及用戶主動激活一個角色的時候,必須遵循一些強制性的規則。具體可以包括爲:

  • 互斥角色

    同一個用戶只能被分爲到一個互斥用戶集合中的至多一個角色,支持責任分離的原則。互斥角色就是權限互相制約的角色,跟概率論裏的互斥差不多意思。

  • 基數約束

    一個角色被分配的用戶數量受限,一個角色可以擁有的角色數目受限,一個角色對應的訪問權限數目也受限。

  • 先決條件角色

    即用戶想獲得某上級角色,必須先獲得下一級的角色。

用戶組和權限組

  • 用戶組

    當用戶基數變大的時候,角色類型增多的時候,一般有一部分人就有了相同的屬性,比如某一個部分中的所有員工,如果直接給某個用戶分配角色,那麼工作量會很大,那麼如果把相同屬性歸到某一個用戶組,那麼直接將用戶添加到某個用戶組下,這個用戶就有了和組裏其他人一樣的權限了。

  • 權限組

    權限組就是將多個權限打包,比如某一個產品的所有模塊的使用權限,在賦予權限的時候,就直接按權限組來賦予。

授權流程

授權就是給用戶授予角色,這個過程可以分爲手動授權和審批授權。

  • 手動授權

    管理員來進行操作,給用戶添加角色,給角色添加用戶。

  • 審批授權

    這個是用戶來申請某一個職位角色,然後管理員或者對應的上級進行審批。

常用權限框架

  • Apache shiro

    shiro是一個開源項目,也是一個輕量級框架,Spring生態裏有Spring security,但比shiro要複雜一點,這裏鑑於篇幅,Spring Security我之後再重新寫一個吧。

    shiro包括三個重要的功能模塊,分別是:

    • Subject,即主體,一般指用戶。
    • SecurityManager,安全管理器,管理所有的主體,可以配合內部安全組件。
    • Realms,用於進行權限信息的驗證,這裏需要自己寫代碼。

    shiro的功能有很多,包括:身份認證,授權,會話管理,加密,web支持,緩存,多線程併發認證,測試支持,Run As,Remember me等。

  • Spring Security

    這個比Shiro要複雜一點,它和SpringMVC有很好的集成,並配置了流行的安全算法實現,安全主要包括認證和驗證,認證是爲用戶建立一個其聲明的角色的過程,這個角色可以是一個用戶,一個設備或者一個系統,驗證指的是一個用戶在應用中能夠執行某個操作。

    它可以分爲:

    • Web/http 安全,通過一系列過濾器來實現框架的認證機制,訪問受限制的url的時候將用戶引導到錯誤界面或者登陸界面。
    • AuthenticationManager 處理來自於框架其他部分的認證請求。
    • AccessDecisionManager,爲web或者方法提供訪問決策,會註冊一個默認的,我們也可以通過普通bean註冊的方式使用自定義。
    • AuthenticationProvider,通過它來認證用戶。
    • UserDetailsService,跟AuthenticationProvider相關,用來獲取用戶信息。
  • 兩者比較

    • shiro更容易使用,實現和理解。Spring Security相比之下更加複雜。
    • SpringSecurity在社區上更勝一籌,並且對Spring生態有很好的支持,但從這方面看shiro其實也有好處,那就是不和其他框架綁定。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章