javascript
sql 账号查询一个表勾选那个权限_Spring Cloud微服务架构中的数据权限DataPermision实现方案...
Spring Cloud微服務架構中的數據權限DataPermision實現方案
一、出現原因
在Spring Cloud的微服務架構中,常見的權限控制除了菜單權限外,還有數據權限DataPermision。菜單權限主要用于控制用戶角色所能訪問的菜單以及頁面按鈕的顯示與否,而數據權限則控制業務數據顯示當前公司,還是所有公司,還是當前公司及其子公司的數據。
近幾年Java項目中,數據中臺也解決了部分數據權限問題,本文來講解下幾種DataPermision數據權限實現方案。
二、核心問題
DataPermision的主要問題在于查詢性能、授權、鑒權以及字段級別的控制。
例如在百萬級別的微服務Spring Cloud架構數據規模,mysql如何實現秒級別的查詢?
百萬級別的權限DataPermision如何授予用戶?
如何快速高效的進行數據鑒權?
怎樣實現字段級別的權限控制?
三、權限模型的核心抽象
先列出一張圖,介紹權限模型的核心概念:
根據上圖權限分析可以分析,能夠觀察到以下幾個元素,只要是:權限實體、部門、角色、菜單權限。
菜單權限:用于控制能顯示哪些菜單,以及頁面按鈕的顯示權限。
權限實體:本部分是DataPermision模型的核心元素,也就是我們需要系統進行控制的數據。例如:Customer客戶、Order訂單,渠道,區域等。
Dept部門:也就是一般意義上的部門組織結構。
角色Role:用于進行抽象的實體,用來進行快速分配權限相同權限給一批用戶,與菜單權限中的角色概念一致。
四、權限DataPermision的查詢模型
根據上面的權限模型圖,列出一條sql:
select xxx from xx_table where account in (xxx) and product_group in (xxx) and country in (xxx)
這就是這個模型的查詢模型。其中account,product_group,country代表需要做權限控制的權限實體。
在這里只是一個簡單的模型,如果account或者country等數據量足夠大時,可以發現mysql in查詢是會出現非常嚴重的查詢性能的。比如account數據量規模為100萬級別時。
4.1引入部門組織結構,突破數據量的限制
還是依賴于Spring Cloud DataPermision模型圖,我們有一個部門組織結構,我們可以想象下:例如總經理,自然是能夠查看所有部門的數據。比如A部門經理,可以查看A部門和他們的子部門的數據權限。如果是普通的員工,只能查看自己賬號下面的數據。
我們給出一個部門的微服務組織結構圖,給每個部分標志一個key,key的生成規則:
1.根部門的key為數字10
2.根部門的直屬部門的key為10 001,10 002,10 003...以此類推
3.其他的key生成邏輯和步驟2相同,唯一不同的就是key的長度變長了,比如:10 001 001,10 001 002
我們給部門貼上下面的key:
有了該模型,我們結合mysql的前置查詢索引的特性(dept like 'xxxx%')
where dept like '10%'
dept like '10001%'
dept like '10002%'
上面的查詢,在mysql下,300萬的數據規模,可以實現1S內響應!!!
4.2怎樣授權
查詢性能問題解決之后,授權也就是可以解決了。
授權我們一般根據員工的崗位來設定,普通員工,部門經理
普通員工:不需要單獨授權,直接綁定員工工號即可
部門經理:設置該員工可以查看的部門(支持多個)
4.3怎樣鑒權
進行鑒權和來自授權一般是相互的一個過程
1.判斷該員工是否為使用的部門經理
2.如果是,取出部門權限的key
3.添加到sql中,使用mysql前置like查詢數據
4.4數據庫的實現
1.識別權限實體
2.給權限實體加上一個工號字段,一個部門字段,比如:emp_no,dept_no
3.查詢時,先獲取員工的角色權限,如果是部門經理,那么獲取對應的key列表
4.構建sql,加入部門或者工號的sql片段:
dept_no like '10 001%' or dept_no like '10 002%',這是部門的sql
emp_no = 'xxx',這是普通員工的sql
五、總結
Spring Cloud微服務架構中還需要識別出權限實體,進行控制的數據。還需要注意數據庫索引的結合。易于擴展。
本文所介紹的方法易于在微服務架構擴展,易于進行權限控制。
總結
以上是生活随笔為你收集整理的sql 账号查询一个表勾选那个权限_Spring Cloud微服务架构中的数据权限DataPermision实现方案...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python单行箭头_在Python中,
- 下一篇: filter过滤后重新添加_Spring