https://www.jianshu.com/p/115938c6294e
# RBAC權限模型\[完整\]
## 一、前言
? ? 權限一句話來理解就是對資源的控制,對web應用來說就是對url的控制,關于權限可以毫不客氣的說幾乎每個系統都會包含,只不過不同系統關于權限的應用復雜程序不一樣而已,現在我們在用的權限模型基本上都是以RBAC為基礎進行擴展的,我們今天就將RBAC權限模型進行下介紹。?
## 二、RBAC模型
? ? RBAC是Role-BasedAccess Control的英文縮寫,意思是基于角色的訪問控制。RBAC認為權限授權實際上是Who、What、How的問題。在RBAC模型中,who、what、how構成了訪問權限三元組,也就是“Who對What(Which)進行How的操作,也就是“主體”對“客體”的操作,其中who——是權限的擁有者或主體(如:User、Role),what——是資源或對象(Resource、Class)
? ? RBAC其實是一種分析模型,主要分為:基本模型RBAC0(Core?RBAC)、角色分層模型RBAC1(Hierarchal?RBAC)、角色限制模型RBAC2(Constraint?RBAC)和統一模型RBAC3(Combines?RBAC)。
### 1)RBAC0
? ? RBAC0,它是RBAC0的核心,RBAC1、RBAC2、RBAC3都是先后在RBAC0上的擴展。RBAC0定義了能構成RBAC控制系統的最小的元素集合,RBAC0由四部分構成:
? ??a、用戶(User)
? ??b、角色(Role)
? ??c、會話(Session)
? ??d、許可(Pemission),其中許可又包括“操作”和“控制對象”其中許可被賦予角色,而不是用戶,當一個角色被指定給一個用戶時,此用戶就擁有了該角色所包含的許可。會話是動態的概念,用戶必須通過會話才可以設置角色,是用戶與激活的角色之間的映射關系。

? ??圖中,用戶與角色是多對多的關系;角色和許可也是多對多的關系;用戶與會話是一對一關系;會話與角色是一對多關系;
## 2)RBAC1
? ? RBAC1,它是RBAC角色的分層模型,RBAC1建立在RBAC0基礎之上,在角色中引入了繼承的概念,有了繼承那么角色就有了上下級或者等級關系

## 3)RBAC2
? ?RBAC2,它是RBAC的約束模型,RBAC2也是建立的RBAC0的基礎之上的,在RBAC0基礎上假如了約束的概念,主要引入了靜態職責分離SSD(Static Separation of Duty)和動態職責分離DSD(Dynamic Separation of Duty)。
? ??SSD是用戶和角色的指派階段加入的,主要是對用戶和角色有如下約束:
a、互斥角色:同一個用戶在兩個互斥角色中只能選擇一個
b、基數約束:一個用戶擁有的角色是有限的,一個角色擁有的許可也是有限的
c、先決條件約束:用戶想要獲得高級角色,首先必須擁有低級角色
? ??DSD是會話和角色之間的約束,可以動態的約束用戶擁有的角色,如一個用戶可以擁有兩個角色,但是運行時只能激活一個角色。

## 4)RBAC3
? ? RBAC3,它是RBAC1與RBAC2合集,所以RBAC3是既有角色分層又有約束的一種模型

? ? 以上就是RBAC模型的四種設計思想,現在我們用的權限模型都是在RBAC模型的基礎上根據自己的業務進行組合和改進。
# 三、我們的權限模型
? ??先大概解釋下我們的業務,我們做的是教育行業高校云平臺,每個學校都可以在我們平臺進行注冊,注冊完成后可以享受一些基礎的服務,當然了不同級別的用戶享受的基礎服務是不同的,這些基礎的服務包括新生注冊管理、基礎系統管理、考試系統管理、評教系統管理等模塊,每個模塊都相當于一個子系統,每個子系統都有各自的功能,每個功能也都有各自的相關的頁面,而所有的子系統、頁面以及頁面上的功能按鈕都是需要我們權限進行管理,所以我們的權限管理相對來說任務也是比較繁重的。
? ??我們先來看下我們權限管理模塊的類圖:

? ? 核心還是基于用戶、角色和許可的RBAC模型,只不過我們將這三者分別進行了相應的擴展:
## 用戶
? ??無論哪個用戶首先它必須是屬于某個部門的,部門是行政單位,而某個部門也可以包含多個用戶,所以部門和用戶的關系為1對多的關系;
? ? 先說一下為什么要有用戶組的概念,如果有一類的用戶都要屬于某個角色,我們一個個給用戶授予角色,重復工作特別多,所以我們把這么一些用戶進行分類,也就是用戶組,這樣的話,我們直接對用戶組賦予角色,減少重復的工作量,這樣達到的目的是這,用戶擁有的所有許可,就是用戶個人所屬角色擁有的許可與該用戶所在用戶組所屬角色擁有的許可之和。一個用戶可以屬于多個用戶組,一個用戶組也可以包括多個用戶,所以用戶與用戶組是多對多的關系;
## 角色
? ??角色是一定數量的許可的集合,許可的載體,一個角色可以包含多個用戶,一個用戶同樣的也可以屬于多個角色,所以角色與用戶的關系為多對多的關系。同樣的一個角色可以包含多個用戶組,一個用戶組也可以屬于多個角色,所以角色和用戶組也是多對多的關系;
## 許可
? ??許可我一般稱它為權限,它包括控制對象和操作,控制對象一般為資源,包括菜單、頁面、文件等資源,而操作一般包括增刪改查等,圖中“系統操作”就是操作,“菜單信息”就是控制對象;
? ? 菜單信息中的每個菜單都會有增刪改查等操作,所以菜單信息與系統操作是一對多的關系;
? ??我們給角色授予權限時,授予就是顆粒最小的權限,所以我們將系統操作權限授予某些角色。一個角色可以擁有多個系統操作,一個系統操作同樣也可以屬于多個角色,所以系統操作和角色為多對多的關系。
? ??到這里我們就將我們的權限模型之間的關系基本上介紹完畢了,在類圖中的兩個類之間的多對多的關系在數據庫中會出現第三張表,所以下面我們來看下我們的數據庫中表的關系圖:

# 四、改進
? ??現在這個權限模型已經開發出來投入使用了,當然了現在的模型也不一定是最好的,只能說針對于現在的系統的規模是比較合適的,對于現在的權限模型還是有可以擴展的地方,其實就是類圖中的菜單信息,在系統中我們只是粗獷的將子系統名稱、子系統菜單、子系統菜單頁面元素、文件等這些資源全部放到了一個表中即菜單信息表,在表中我們利用類型進行具體區分,同時利用上下級關系來管理他們之間的層次關系,但是在這個表中冗余的數據會特別多,我覺得如果可以更進一步改善的話,可以考慮將菜單表按照菜單類型進行拆分,然后再來一張表資源關系表來管理這些類型資源之間的關系。

# 五、總結
? ??這篇文章我們將RBAC權限模型的4種設計思想進行了介紹,接下來我將我們自己項目中的權限模型進行了詳細的介紹,最后還針對我們當前的權限模型提出了自己的一點想法。如有異議的地方,請大家多多指正。
\---------------------
作者:lorron
鏈接:https://www.jianshu.com/p/115938c6294e
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
- 空白目錄1
- RBAC
- RBAC權限模型[完整]
- 你知道權限管理的RBAC模型嗎?
- rbac 一個用戶對應多個賬號_如何設計一個強大的權限系統
- Postman 快速使用(設置環境變量)
- postman的使用方法詳解!最全面的教程
- Postman常用的幾個功能
- ThinkPHP項目總結
- thinkphp5 遞歸查詢所有子代,查詢上級,并且獲取層級
- PHP原生項目之留言板
- 智慧校園
- PHP如何實現訂單的延時處理詳解
- VUE
- const {data:res} = await login(this.loginForm)
- Vue中的async和await的使用
- PHP實現消息推送(定時輪詢)
- tp5 計算兩個日期之間相差的天數
- 使用jquery的ajax方法獲取下拉列表值
- jQuery實現select下拉框選中數據觸發事件
- SetFocus 方法
- 快來了解下TP6中的超級函數app()!
- PHP socket 服務器框架 workerman
- 程序員如何才能成為獨立開發者?
- PHP 錯誤處理
- php面向對象類中的$this,static,final,const,self及雙冒號 :: 這幾個關鍵字使用方法。
- 小白教你玩轉php的閉包
- 關于TP6項目搭建的坑(多應用模式)
- ThinkPHP6.0 與5.0的差別及坑點
- axios在vue項目中的使用實例詳解
- php中的類、對象、方法是指什么
- 聊一聊PHP的依賴注入(DI) 和 控制反轉(IoC)
- 深入理解控制反轉(IoC)和依賴注入(DI)
- Private,Public,Protected
- ThinkPHP5(目錄,路徑,模式設置,命名空間)
- 在 ThinkPHP6 中使用 Workerman
- 介紹thinkphp lock鎖的使用和例子
- php中_initialize()函數與 __construct()函數的區別說明
- api接口數據-驗證-整理
- api接口數據-驗證-整理【續】
- TP6容易踩得坑【原創】
- TP6的日志怎么能記錄詳細的日志?
- 是否需要模型分層
- PHP面試題 全網最硬核面試題來了 2021年學習面試跳槽必備(一)
- MySQL單表數據量過千萬,采坑優化記錄,完美解決方案
- MySql表分區(根據時間timestamp)
- MySQL大表優化方案
- 閑言碎語
- 數據庫外鍵的使用
- 深入理解thinkphp、laravel等框架中容器概念
- vue做前端,thinkphp6做后臺,項目部署
- 簡單MVC架構的PHP留言本
- TP5里面extend和vendor的區別
- 在mysql數據庫中制作千萬級測試表
- MySQL千萬級的大表要怎么優化
- ThinkPHP關聯模型操作實例分析
- lcobucci/jwt —— 一個輕松生成jwt token的插件
- RESTful API 設計指南
- MySQL如何為表字段添加索引
- ThinkPHP6.0快速開發手冊(案例版)
- tp5 靜態方法和普通方法的區別
- 數據字典功能
- mysql中的數據庫ID主鍵的設置問題
- 基于角色的權限控制(django內置auth體系)
- RBAC系統經典五張表
- 什么是接口文檔,如何寫接口,有什么規范?
- thinkphp5.0自定義驗證器