在前面兩篇隨筆《ABP開發框架前後端開發系列---(7)系統審計日誌和登錄日誌的管理》和《ABP開發框架前後端開發系列---(8)ABP框架之Winform界面的開發過程》開始介紹了許可權管理的內容,其中只是列出了內部的許可權系統的審計和登陸信息,以及對Winform界面的整合,本篇隨筆繼續介紹ABP開... ...
在前面兩篇隨筆《ABP開發框架前後端開發系列---(7)系統審計日誌和登錄日誌的管理》和《ABP開發框架前後端開發系列---(8)ABP框架之Winform界面的開發過程》開始介紹了許可權管理的內容,其中只是列出了內部的許可權系統的審計和登陸信息,以及對Winform界面的整合,本篇隨筆繼續介紹ABP開發框架的許可權控制管理內容,包括用戶、角色、機構、許可權等方面,以及該框架在Winform方面的應用集成。
1、ABP框架的許可權控制管理內容
我們知道,許可權管理一般都會涉及到用戶、組織機構、角色,以及許可權功能等方面的內容,ABP框架的基礎內容也是涉及到這幾方面的內容,其中它們之間的關係基本上是多對多的關係,它們的關係如下所示。
不過在官網下載的框架裡面,包含許可權管理這些應用服務層和展示層的內容並不完整,只是簡單的包括了用戶和角色的基礎管理,而且很多許可權管理所需要的基礎功能並沒有提供。
根據ABP框架提供的基礎資料庫表,我們可以進一步整理許可權管理幾個重要概念和真實資料庫表之間的對應關係,基於這個基礎上,我們可以完善整個許可權管理模塊內容。
上圖是ABP基礎框架中許可權模塊裡面包含的一些主對象表和中間表,中間表主要用來存儲兩個對象之間的多對多關係,如角色包含多個用戶,用戶屬於多個機構,機構包含多個角色等等。
2、基於ABP框架的許可權管理模塊
1)組織機構管理
組織機構主要就是一個層級的對象關係,一般包含但不限於公司、部門、工作組等的定義,其中組織機構包含用戶成員和角色成員的關係,如下界面所示。
組織機構包含的成員可以添加多個人員記錄,添加界面如下所示。
添加角色界面如下所示。
2)角色管理
角色信息沒有層級關係,可以通過列表展示。
其中角色包含許可權分配和角色成員的維護,如下是角色編輯界面,包含角色基本信息、許可權、成員管理等。
角色的許可權包含系統可以用的許可權,並可以勾選為角色設置所需的功能點,如下界面所示。
用戶成員則和機構的用戶管理一樣,可以指定多個用戶。
3)用戶管理
用戶管理只需要管理用戶基本的信息即可,我們如果需要分配角色可以在角色管理裡面統一處理。當然,創建用戶的時候,也可以ABP框架的收費版本界面一樣,為用戶指定角色和機構信息。
我這裡主要是維護用戶信息即可,用戶列表界面如下所示。
用戶編輯或者查看界面,除了可以看用戶基礎信息外,可以查看用戶包所屬的機構(多個),或者所屬的角色(多個)
當然可以查看這個用戶本身擁有的許可權功能點,如下界面所示。
4)許可權功能
嚴格來說,ABP框架並沒有統一管理好許可權功能點的,它沒有任何表來存儲這個功能集合,而是通過派生AuthorizationProvider的子類來定義許可權功能點,這種需要通過指定AuthorizationProvider的子類的方式創建功能點,需要每次系統模塊增加功能點的時候,編碼一下,然後增加自己的功能點,如下界面所示。
這種方式可能能夠滿足大多數的需要,不過我如果需要增量開發,或者動態增加某些功能點的時候,就有點不方便了。
我在這個基礎上引入了一個許可權功能的表用來存儲功能點的,然後提供管理界面來動態維護這些功能點。如下界面所示。
這樣我可以動態添加或者批量添加所需要的功能點,並且和整個許可權管理模塊串聯起來,形成一個完整的控制體系。
這些概念主要還是來源於我的Winform開發框架和混合式開發框架裡面的控制思路,以及界面展示的處理。
這樣我們就可以管理自己的許可權功能點,並可以為指定的角色配置相關的控制功能點,如下表所示是角色的許可權集合(系統中間表),也就是給角色分配的功能點,依舊是在原來的系統表裡面存儲。
3、許可權控制在業務模塊界面中的使用
我們擁有了用戶、角色、機構、許可權功能以及它們之間的關係後,我們可以按照一個完善的許可權系統來創建對應的用戶角色許可權關係,並通過在客戶端對界面許可權的判斷和服務端對操作許可權的判斷,實現完整的控制處理。
服務端由ABP框架內置許可權進行管理,通過在AppService裡面定義好增刪改查等許可權點,如引用服務層的基類設置了幾個許可權點的屬性。
我們在子類裡面指定這些操作的變數即可,如產品應用服務中,我們可以定義CreatePermissionName為 Product/Add 這樣的名稱,當然也可以自定義。
然後每次在Action中調用相應的檢查即可,如下是對創建的判斷檢查。
或者更新操作的許可權檢查
如果對於導入、導出等其他許可權,我們則可以通過調用
void CheckPermission(string permissionName);
來進行自己自定義許可權名稱的判斷。
在客戶端,我們登錄成功後,獲取用戶的許可權集合,然後在客戶端進行判斷即可進行許可權的控制管理,可以控制菜單、按鈕等界面元素,如下是整合了許可權控制的產品信息管理界面。
分頁列表展示界面的控制代碼如下所示。
編輯或者查看界面的控制代碼如下所示
這樣我們 就可以整合了許可權到業務管理模塊裡面,實現對菜單、按鈕等元素的許可權控制了。
首先在許可權管理系統模塊裡面為用戶角色添加對應的產品管理許可權點。
產品信息界面展示如下所示。
如果在許可權模塊的角色裡面取消對應的功能點,那麼產品管理功能不可用。