組織機構資料隔離(上級可看下級,同級遮蔽)的高效實現思路
阿新 • • 發佈:2020-09-17
背景
在WEB開發中,採用前後端分離,要求對使用者資料許可權進行控制:
1.上級組織可檢視下級組織的資料,同級別不能相互檢視;
2.可設定僅檢視自己建立的資料;
在資料庫結構設計時,通常將組織機構設計為樹形結構,表結構“Id,Name,ParentId。。。”,
Id Name ParentId Level
1 總公司 0 1
2 分公司1 1 2
3 分公司2 1 2
4 部門A 2 3
5 部門B 3 3
6 部門C 2 3
這樣設計表結構清晰明瞭,可新增多級組織架構。不過,獲得某人所在層級和所有下級列表時,SQL使用遞迴等方法效率較低,通常的做法是:
- 使用者A已登陸,並攜帶token訪問API,查詢訂單Order003
- API根據使用者Id獲得其所在組織及下級組織列表IdList
- 查詢得知訂單Order003是使用者B建立的
- 獲得B所以組織Id,並驗證是否在IdList中
- 如果有權訪問,則返回Order003訂單資料,否則返回“無權檢視”資訊
以上步驟在SQL查詢語句中雖然可通過多表JION及WHERE條件來實現,但執行效率很低,關鍵是這種許可權驗證非常頻繁,造成系統整體執行效率低下,需要找一個更高效的方法來實現。
方案一
- 指導思想是“以空間換時間”
- 組織機構表設計成非樹形結構
- 組織程式碼為
BIGINT
型別,最多9級,每級程式碼由兩位數字組成(10-99)- 訂單表中增加一個欄位:建立人組織程式碼
--使用者A是【A大區E公司】的,組織程式碼為111400,查詢訂單Order003,SQL大致如下: select * from OrderTable where id='Order003' and num between 111400 and 111499
是否有許可權檢視該條資料通過num between 111400 and 111499
來控制,如果無權檢視,則返回空,執行效率幾乎與無鑑權時相同。
方案二
- 本方案是在【方案一】的基本上進行改造,降低程式程式碼實現難度
- 組織程式碼欄位為
VARCHAR
型別,格式為xx.yy.zz.
- 組織層級數不限,只要程式碼欄位設定足夠大
--使用者A是【A大區E公司】的,組織程式碼為1.1.,查詢訂單Order003,SQL大致如下:
select * from OrderTable where id='Order003' and num like '1.1.%'
總結
以上方法僅為組織機構許可權驗證的高效方法,供大家參考,誰有更好的思路請留言賜教!