toB 的系統,除了普通的權限管理之外,往往還需要數據范圍權限。本文介紹一種,簡單的易實現的 Saas 多租戶數據范圍權限系統的簡單設計與實現。
權限的概述
我們一般說權限的時候是在說「功能權限和數據權限」 。
功能權限指用「戶登陸系統后能看到什么模塊,能看到哪些頁面」 ,
而數據權限指的「是用戶在某個模塊里能看到幾條數據,能看到哪些數據」 。
基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
- 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
- 視頻教程:https://doc.iocoder.cn/video/
功能權限
在企業系統中,通過配置用戶的功能權限可以解決不同的人分管不同業務的需求,基于RBAC模型,RBAC(Role Based Access Control)模型,它的中文是基于角色的訪問控制,主要是將功能組合成角色,再將角色分配給用戶,也就是說「角色是功能的合集。」
為何要基于RBAC
企業A一共有12個功能,需要創建100個用戶,這些用戶中有管財務的、有管人事的、有管銷售的等等。如果不引入RBAC模型,我們需要每創建一個用戶就要分配一次功能,至少(每個用戶只有一個功能)操作100次,如果人數增加到1000甚至10000,并且一個用戶可能會有多個功能的時候,操作會非常繁瑣,如圖:
![53f9cf3a-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_iAeCMJAAVhTFBYGSM061.png)
經過多次操作發現:分配給某些人的功能都是相同的,比如分配給A、B等10個用戶的功能都是客戶管理、訂單管理及供應商管理這幾個模塊,那是不是可以把這幾個功能模塊打成一個包整體分給需要的用戶呢?
這個包就叫做角色。由于角色和功能的對應關系相對固定,給用戶分配權限的時候只分配角色即可。
![542e89f0-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_iAVpxeAAB85S07KPM055.png)
總結:
- 解耦用戶和功能,降低操作錯誤率;
- 降低功能權限分配的繁瑣程度。
![5444429a-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_iAGKK9AAMqt8ifMTU931.png)
功能粒度
功能的粒度從粗到細一般分為:「模塊級->頁面級->接口級(接口級的功能權限指的是哪個角色能調用哪些接口)。」
從后臺角度:為了系統安全,代碼肯定都會實現到接口級。那我們做粒度選擇的意義是什么?當然是為用戶降本增效。只是粒度越粗,用戶操作越簡單,靈活性卻越低。
用戶的優先級
我們常用的優先級順序是查看「詳情>查看列表>增加、刪除、編輯、其他操作按鈕」 。
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
數據權限
數據權限解決的是用戶能看到多少數據量和什么數據的問題,例如A和B兩個用戶都能看到銷售模塊,但A能看到320條數據,B只能看到100條數據,且A能看到的320條數據中包含著B能看到的100條數據,這些都是由數據權限決定的。
數據權限和什么有關系
數據權限一般和企業的組織架構相關,而組織架構分為樹狀和扁平狀的(還有更復雜組織架構,此處暫不做說明)
![545ea720-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_iAadnpAADgzselDvk885.png)
「數據權限主要和組織架構有關」 ,組織架構中樹狀架構較為復雜,需要統一或者分模塊的定義層級間數據共享問題。
數據權限定義過程中如果出現同一結點下的【用戶間層級問題(上下級)】需要回到功能權限的【角色定義】去解決。
數據權限的操作步驟
思想
「數據權限的控制是通過部門的菜單展示來實現的。」
用到數據權限的地方
- 用戶添加時候,選擇部門的下拉框
![546f642a-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_iAPxTXAAIXqq2HgEE568.png)
- 部門管理的列表
![547f0c2c-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_iAT_dDAAIlQmutGZc768.png)
- 角色管理,新增彈框頁面,選擇部門的樹狀菜單
![5495d696-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_mAF4URAAHmdVEgFT8573.png)
部門管理中部門列表的數據權限
controller層加載部門列表,加載全部部門信息
![54ad70bc-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_mAJOFDAAHzikU9VK0797.png)
sevice層邏輯:將當前登錄用戶所擁有的部門id設置成查詢部門列表的where的篩選條件
![54ecbea2-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_mAGXn-AAKMjw4sDXQ086.png)
![55022dc8-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_mAZViLAACSVxpUKv4873.png)
定義一個commonDataservice層:獲取用戶所具有的所有部門ids
![55161c66-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_mAZKsmAAJ7CrJhfLw965.png)
- 如果當前登錄用戶id為超級管理員,則加載全部菜單信息,如下圖所示:
![5534ffaa-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_mAK9ZZAABIyD--JRc400.png)
- 如果當前登錄用戶id不為超級管理員,通過用戶id,獲取sys_role_dpet,sys_user_role這兩張表進行關聯(「已擁有制定部門的權利且未占用」 ),獲取該登錄用戶所屬的部門id
![55427a7c-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_mAKRC6AABqWBXJ-G4180.png)
- 數據權限用戶已經分配且已經擁有的部門(「已擁有制定部門的權利且已占用」 ),「作用是選擇了一個一級部門,那么一級部門所包含的二級部門,三級部門等也要賦值給用戶,也就是說擁有的部門下面還有子部門,那么也具有該部門以及子部門的擁有權,使用遞歸算法全部遍歷獲得。」 如下圖所示
![5550f106-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_qARvkpAAKeGU2z-14679.png)
![556840e0-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_qAVw1OAAD0H_FSHcI928.png)
![5576121a-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_qADnoLAABG0OgFr1U293.png)
- 將當前登錄用戶所擁有的部門id通過逗號進行拼接
![5589eb5a-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_qAJGiOAADylDq4f7s018.png)
用戶新增彈框中的部門列表的數據權限
同樣調用的是SysDepartController中的depart/list的方法,邏輯見2.3節
![55a32dc2-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_qATn0xAAEGCgtfO3I119.png)
![55b6c882-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_qAf9zSAAEBqje1R9M373.png)
角色管理中新增彈框中的部門列表的數據權限
同樣調用的是SysDepartController中的depart/list的方法,邏輯見2.3節
![55ce4796-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_qAAeBHAAEqZmZIMuI300.png)
![55e2aca4-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_uAOZB5AABw32wmugg059.png)
操作案例
- 例如用戶debug用戶的角色為操作權限角色,分配部門為開發一部下面的測試部門
![55f23390-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_uAS6LhAAJHJ7VXYGg337.png)
- 使用超級管理員,給操作權限角色分配數據權限,這里選擇新分配一個開發二部下面的測試部,如下圖所示:
![5620da42-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_uAQjKlAAGfB6SkB0g269.png)
- 使用debug用戶登錄查詢
![564137c4-c9f4-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/FB/wKgaomTne_uABOatAAFlPNjjPNo716.png)
關于數據范圍權限的設計與實現,你有什么好的方案?歡迎留言評論!
審核編輯 :李倩
-
模塊
+關注
關注
7文章
2733瀏覽量
47747 -
SaaS
+關注
關注
1文章
363瀏覽量
37030 -
數據權限
+關注
關注
0文章
4瀏覽量
6109
發布評論請先 登錄
相關推薦
基于SaaS模式的數字電視字幕控制系統
什么是SaaS?
SaaS投資有哪些門道?
阿里云發布新版SaaS上云工具包,全面助力SaaS上云
入駐在線教育saas系統會面臨哪些問題?
區域權限系統的設計
![區域<b class='flag-5'>權限</b><b class='flag-5'>系統</b>的設計](https://file.elecfans.com/web2/M00/48/DC/pYYBAGKhtCmAAUHdAAAMELn2c9A740.jpg)
權限系統中的數據權限設計經驗分享
基于Saas多租戶數據范圍權限系統的簡單設計與實現
大型SaaS系統的數據范圍權限的三種實現方案
Saas多租戶數據范圍權限系統的簡單設計與實現
![<b class='flag-5'>Saas</b>多租戶<b class='flag-5'>數據</b><b class='flag-5'>范圍</b><b class='flag-5'>權限</b><b class='flag-5'>系統</b>的簡單設計與<b class='flag-5'>實現</b>](https://file1.elecfans.com/web2/M00/A5/F6/wKgaomUQ8LmAZVgoAABXFRhMao8431.png)
評論