天天看點

SQL Server使用視圖做權限控制問題引入問題分析解決問題寫在最後

這天老鳥火急火燎的跑到菜鳥旁邊,想必是遇到什麼難題了:“現在有這麼一個場景,假如有三種角色,并且存在層級關系,他們需要通路同一個資料源表,但是需要做權限控制,使得每種角色隻能看到自己及以下層級的資料。比如:公司有ceo,manger和普通的employee三種角色,ceo可以檢視ceo、manager和employee層級的資料;manger隻能檢視manger和employee的資料,不能檢視ceo層級;而employee隻能檢視employee的資料,不能檢視ceo和manager級别的資料。這個在sql server有比較簡單清爽的實作方法嗎?”。老鳥這個問題的确問得非常有水準,這個場景也非常普遍,菜鳥頓時陷入了無邊的困境。

在關系型資料庫sql server中,權限的确不能達到行列級别這麼細粒度的控制,這也是菜鳥為什麼陷入困境的原因。但是,突然菜鳥靈魂出竅,靈光一現,像是被雷劈中一般的感覺:雖然sql server基于表無法達到那麼細粒度的權限控制,但是我們可以建立視圖(view),用視圖來建立正式表的行、列過濾,然後在視圖對象上做權限控制,最終達到對三個層級的權限控制的目的,想到這裡菜鳥立馬赫然開朗。

菜鳥越想越激動,說打就打,說幹就幹,于是開始了萬裡長征。

建立測試資料庫test,接着建立三個使用者ceo,manager和employee,然後建立測試表tb_test_viewpermission,最後插入三條測試資料,每個層級一條資料。

表對象和資料準備完畢後,接着我們建立三個視圖,分别過濾出自己所在層級及以下層級的資料。比如,ceo包含ceo、manager和employee層級資料;manger包含manger和employee層級資料;employee僅包含employee層級資料。

所有視圖建立完畢後,接下來是最為關鍵的步驟,就是對視圖權限的設定。基本的思路是:拿掉所有使用者對于基表的權限,對于視圖需要拿掉自己以下層級使用者權限,然後給予視圖自己層級使用者的檢視權限。比如:manager層級視圖dbo.v_employeeinfo_formanager需要拿掉employee的權限,授予manager查詢權限。

以上所有工作準備完畢後,接下來就是最緊張的權限驗證環節了,時間才是檢驗真理的唯一标準。

按照預期,ceo應該不能通路基表資料,會報告異常,但是可以查詢ceo,manager和employee層級資料,總共三條。測試語句如下,将ssms的結果顯示切換為text模式,或者直接快捷鍵ctrl + t。

結果顯示如下,測試結果的确與預期吻合。

SQL Server使用視圖做權限控制問題引入問題分析解決問題寫在最後

預期是manger對基表沒有通路權限,也沒有ceo視圖的通路權限,但是可以檢視到manger和普通employee的資料,也就是會傳回兩條資料。

查詢結果展示如下,測試結果再次與預期吻合。

SQL Server使用視圖做權限控制問題引入問題分析解決問題寫在最後

預期是employee沒有基表權限,沒有ceo視圖檢視權限,也沒有manager視圖查詢權限,隻能看到employee層級資料,也就是會傳回一條資料。

結果顯示如下,employee層級測試結果也完全滿足預期。

SQL Server使用視圖做權限控制問題引入問題分析解決問題寫在最後

從測試結果來看,sql server使用視圖來做權限控制方法是相當的清爽和徹底滿足老鳥預期的。于是菜鳥得意洋洋的來到老鳥辦公室,霸氣的展示了自己的解決方案和例子,老鳥覺得非常滿意。