天天看點

建構ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的背景管理系統(21)-權限管理系統-跑通整個系統

這一節我們來跑通整個系統,驗證的流程,通過AOP切入方式,在通路方法之前,執行一個驗證機制來判斷是否有操作權限(如:增删改等)

原理:通過MVC自帶篩選器,在篩選器分解路由的Action和controller來驗證是否有權限。

建構ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的背景管理系統(21)-權限管理系統-跑通整個系統

首先我們要了解一下篩選器

篩選器的由來及用途

有時,您需要在調用操作方法之前或運作操作方法之後執行邏輯。

為了對此提供支援,ASP.NET MVC 提供了篩選器。 篩選器是自定義類,可提供用于向控制器操作方法添加操作前行為和操作後行為的聲明性和程式設計性手段。

ASP.NET MVC 支援以下類型的操作篩選器:

授權篩選器。 這些篩選器用于實作 IAuthorizationFilter 和做出關于是否執行操作方法(如執行身份驗證或驗證請求的屬性)的安全決策。 AuthorizeAttribute 類和 RequireHttpsAttribute 類是授權篩選器的示例。 授權篩選器在任何其他篩選器之前運作。

操作篩選器。 這些篩選器用于實作 IActionFilter 以及包裝操作方法執行。 IActionFilter 接口聲明兩個方法:OnActionExecuting 和 OnActionExecuted。 OnActionExecuting 在操作方法之前運作。 OnActionExecuted 在操作方法之後運作,可以執行其他處理,如向操作方法提供額外資料、檢查傳回值或取消執行操作方法。

結果篩選器。 這些篩選器用于實作 IResultFilter 以及包裝 ActionResult 對象的執行。 IResultFilter 聲明兩個方法:OnResultExecuting 和 OnResultExecuted。 OnResultExecuting 在執行 ActionResult 對象之前運作。 OnResultExecuted 在結果之後運作,可以對結果執行其他處理,如修改 HTTP 響應。 OutputCacheAttribute 類是結果篩選器的一個示例。

異常篩選器。 這些篩選器用于實作 IExceptionFilter,并在 ASP.NET MVC 管道執行期間引發了未處理的異常時執行。 異常篩選器可用于執行諸如日志記錄或顯示錯誤頁之類的任務。 HandleErrorAttribute 類是異常篩選器的一個示例。

建立自定義操作篩選器

架構将先調用操作篩選器的 OnActionExecuting 方法,然後再調用以操作篩選器特性标記的任意操作方法。 同樣,該架構将在操作方法完成後調用 OnActionExecuted 方法。

調用 OnResultExecuting 方法後,要立即調用您的操作傳回的 ActionResult 執行個體。 執行結果後,緊接着就要調用 OnResultExecuted 方法。 這些方法對于執行日志記錄、緩存輸出結果之類的操作非常有用。

以上都是理論問題了,說到底我們就是要OnActionExecuting利用這個方法

當一個Action被執行時調用OnActionExecuting判斷是否有權限操作。

由于OnActionExecuting涉及到其他使用者和權限的通路我們需要添加SysUser和SysRight的BLL和DAL層了

我們還需要一個存儲過程[P_Sys_GetRightOperate]用于取子產品的目前使用者操作權限,這裡為什麼用存儲過程呢,快點呗,反正這快不用怎麼維護了

存儲過程如下:

建構ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的背景管理系統(21)-權限管理系統-跑通整個系統
建構ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的背景管理系統(21)-權限管理系統-跑通整個系統

View Code

建立好了把存儲過程更新到EF中去,EF5.0将自動建立一個複雜的類型,大家可以打開來看下

建立一個權限的類permModel,我們将擷取到的權限儲存到這個類中去,這個類最終是一個一個的session轉換而來的。

SysUser的BLL層和SysRight的DAL層了,如下:

建構ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的背景管理系統(21)-權限管理系統-跑通整個系統
建構ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的背景管理系統(21)-權限管理系統-跑通整個系統

ISysRightRepository

建構ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的背景管理系統(21)-權限管理系統-跑通整個系統
建構ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的背景管理系統(21)-權限管理系統-跑通整個系統

SysRightRepository

GetPermission将通過存儲過程通路取得資料

建構ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的背景管理系統(21)-權限管理系統-跑通整個系統
建構ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的背景管理系統(21)-權限管理系統-跑通整個系統

ISysUserBLL

建構ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的背景管理系統(21)-權限管理系統-跑通整個系統
建構ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的背景管理系統(21)-權限管理系統-跑通整個系統

SysUserBLL

可以把SysRightRepository變成SysUserRepository層,我這樣做是為了區分一下而已,SysRight代表權限,SysUser是使用者,根據不同的使用者擷取他的權限

我們建立一個篩選器在App.Admin下的Core建立SupportFilter.cs

 添加如下代碼:

這是一個篩選器。所有邏輯代碼都在這裡了

打開SysSampleController

修改Create方法變為以下

回到篩選器public string ActionName { get; set; },其中ActionName是自定義Action的名稱,比如在Create中直接[SupportFilter]那麼ActionName取得就是Create,這将和你的資料庫操作碼進行對應的,那麼我的方法是CreateAttr,那麼要使用Create這個操作碼,怎麼辦

那麼就是

 那麼類似的寫法

Index無需填寫操作碼将自動建立操作碼,如果你擁有一個操作碼那麼index将被授權,這個是我們與系統之間的一個約定(你可以去掉這個約定,修改代碼即可)

假如你擁有增删改權限卻沒有通路清單的權限,那不是...

OnActionExecuting負責分解,交給ValiddatePermission去生成權限

如果寫在Areas區域的也是相容的,已經做了處理。

如果你越權操作那麼将執行 HttpContext.Current.Response.Write("你沒有操作權限,請聯系管理者!");

目前位置我們已經跑通了整個系統了,接下來就是自動化的使用者角色之間的授權和子產品的制作了,能跑通,其他都是很簡單了,對吧

這一章比較複雜,需要對AOP程式設計,MVC的篩選器,和路由進行了解,才能讀的比較順。

如果你沒有讀懂,那麼代碼敲一遍,那麼你也就差不多知道了

代碼進行了大量的注釋,還不懂那麼留言。

目前為止,我們一個基于按鈕級别的權限系統已經全部跑通,現在,可以建立一些沒有權限的Action來驗證了

我建立:(很明顯我們資料庫沒有這個test的 action的權限),是以你别想越權操作了

最後預覽

建構ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的背景管理系統(21)-權限管理系統-跑通整個系統

我們預覽一個有權限的

建構ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的背景管理系統(21)-權限管理系統-跑通整個系統

感謝大家,花了你寶貴的時間閱讀這一節。