在前面兩篇隨筆《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);
來進行自己自定義權限名稱的判斷。
在客戶端,我們登錄成功后,獲取用戶的權限集合,然后在客戶端進行判斷即可進行權限的控制管理,可以控制菜單、按鈕等界面元素,如下是整合了權限控制的產品信息管理界面。
分頁列表展示界面的控制代碼如下所示。
編輯或者查看界面的控制代碼如下所示
這樣我們 就可以整合了權限到業務管理模塊里面,實現對菜單、按鈕等元素的權限控制了。
首先在權限管理系統模塊里面為用戶角色添加對應的產品管理權限點。
產品信息界面展示如下所示。
如果在權限模塊的角色里面取消對應的功能點,那么產品管理功能不可用。
?