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