ASP.NET進階權限控管-Part 1 願景

這個主題小喵一直以來一直想要做分享,但是又不知從何分享起,因為小喵的這套機制有點點複雜,他除了可以結合自定資料庫的使用者登入、角色概念外,還搭配了TreeView與資料庫結合,等等的技術。算是一個還蠻進階的運用。相關的介紹可能不是一兩篇Blog能夠介紹完。到底要多少篇小喵也不曉得...就從小喵希望達到的願景(事實上已經達到並上線使用中)開始介紹起。

這個主題小喵一直以來一直想要做分享,但是又不知從何分享起,因為小喵的這套機制有點點複雜,他除了可以結合自定資料庫的使用者登入、角色概念外,還搭配了TreeView與資料庫結合,等等的技術。算是一個還蠻進階的運用。相關的介紹可能不是一兩篇Blog能夠介紹完。到底要多少篇小喵也不曉得...就從小喵希望達到的願景(事實上已經達到並上線使用中)開始介紹起。

 

首先,要回憶一下往事先,小喵在ASP的時代,就寫了一個類似的權限控管機制,一樣是樹狀結構,可以針對每個使用者,設定每個畫面的【查詢、新增、修改、刪除】。相關的設定畫面如下圖:

小喵希望開發出來的權限控管機制,也是類似的狀況。但是以往的狀況有個缺點卻不得不提→組織異動,重新授權不易

舉個例子來說,假設

User甲    有畫面(ABCD)的權限

User乙    有畫面(CDEF)的權限

今天職務調整,讓這兩個人的職務對調

此時,甲要→AB,+EF。  乙要→EF,+AB

其實,看起來,也沒什麼,就刪除4筆,增加4筆而已。不過如果細想一下,如果是跟User甲一樣狀況的有200人,那麼光是刪除、新增就頭大。而最常發生的,就是乙因為需要AB,所以申請+AB,不需要EF卻不申請刪除EF畫面權限,造成ABCDEF都有。

 

因此...小喵希望能夠用【角色(身分)】來做管理,也就是畫面的權限設定,是依照不同的【角色(身分)】來授權,以剛剛的範例,就變成

畫面-----角色(身分),    角色(身分)-----使用者

ABCD-----角色P,          角色P-----User甲

CDEF-----角色Q,          角色Q----User乙

這樣如果當兩邊職務調動的時候,其實只要動到【角色----使用者】這樣的資料就好,甚至未來擴編,有人要有相同的設定,也只需要把這個人設定適當的【角色】就能夠擁有該角色該有的畫面權限了。

除此之外,一個人可以擁有多個角色,例如:一個人可能是【BlueShop的會員】,同時也是【ASP.NET討論區的版主】,因此當他是【BlueShop會員】這個角色時,就擁有【BlueShop會員】該擁有的畫面權限。 而同時,因為又兼具【ASP.NET討論區的版主】因此也擁有【ASP.NET討論區的版主】這角色應該有的畫面權限。

例如:

【BlueShop會員】:權限有畫面ABCD

【ASP.NET討論區的版主】:權限有CDEF

小喵身兼兩個身分,就有權限ABCDEF

----

授權上:
一個角色可以有許多的使用者
一個使用者可以扮演許多的角色
授權時大致區分為查詢(可以點選進入),拒絕(不可點選進入),未設定(無該畫面的任何設定)
依照角色來授權、以拒絕為優先、個人最優先
優先的先後順序為
個人設定>角色拒絕>角色設定
舉個例子
當一個畫面,小喵要進入時,
小喵所屬的任何角色都沒有設定
→因為沒有任何設定可進入→不可進入
小喵所屬的角色中有一個可進、一個不可進
→因為以拒絕為優先→不可進入
小喵所屬的角色中有一個可進、無不可進
→因歸屬於該角色,且無任何拒絕→可進入
小喵所屬的角色中有一個可進,有一不可進,但個人設定為拒絕
→因個人設定為拒絕→不可進入
----------------------------------------------------------------------------------
這樣設計的目的是,畫面功能的設定,以角色設定為基本
如果沒有其他特別的條件,那麼就只需管好角色/使用者之間的關係
當有職務調動的時候,也只需調整使用者的【角色】就可以了一並設定好權限
當然世事往往不如意....會有少許例外的狀況
例外的狀況就以個人的方式設定,所以把個人設定的優先權設定為最高也是這個用意

再仔細的整理一下規則,規則如下:

 

【瀏覽權限控管規則】:
於是就發展出目前小喵的權限控管規則
規則一:(角色管理)因應不同的職務需求,設定【角色】,可由許多使用者扮演相同的角色
規則二:(角色管理)一個【使用者】可以同時扮演許多不同的【角色】
規則三:(授權角色)設定權限時,依照【角色】的職務特性來設定
規則四:(拒絕優先)相同畫面中,當同時擁有的兩個以上【角色】有設定【拒絕】→以【拒絕】為優先
規則五:(個人最優先)當有個人【使用者】發生規則四狀況被拒絕,但右必須使用時→以【個人設定為最優先】

【查詢、新增、修改、刪除、列印權限】
規則一:先有瀏覽權限→再談這些設定(沒有權限瀏覽,一進畫面就被踢出,當然什麼也沒有)
規則二:所屬角色+使用者自己的設定中,只要其中有一可執行→就可執行
        例如小喵分屬RoleA,RoleB
        RoleA有查詢、新增、修改的權限
        RoleB有查詢、刪除的權限
        那麼小喵有的權限就是綜合起來的【新增(A)、修改(A)、刪除(B)】

【特殊角色:SysAdmin】
規則:擁有此角色的使用者,擁有最高的權限,任何畫面、任何功能均可使用

最後得到的畫面會是類似這樣:

 

畫面驗證:

用以上的這些規則來設定後,希望未來畫面能夠透過最簡單的方式,就能夠達到以下幾個動作

  1. 自動取得畫面名稱
  2. 自動取得畫面的抬頭名稱
  3. 驗證畫面是否有權限,沒權限者自動踢出登出
  4. 取得畫面的各項權限設定(查詢、新增、修改、刪除、查詢、列印等)
  5. 自動計算畫面使用次數(另有畫面可以查使用者、畫面使用次數累計)

以上就是小喵希望能夠達到的願景,畫面可以自己增減,權限可以動態設定,並且導入角色概念,以角色為主,個人為輔。並且一切都記錄在資料庫中。後面會陸續的說明,如何達到這樣的願景。

Part 2 : ASP.NET進階權限控管-Part 2 登入結合資料庫、樹狀結構維護

 

 


以下是簽名:


Microsoft MVP
Visual Studio and Development Technologies
(2005~2019/6) 
topcat
Blog:http://www.dotblogs.com.tw/topcat