「麥荻網教系統」採用了先後端代碼分離的架構,即「Miidy.Cloud.Console」站與「Miidy.Cloud.Manage」站(兩個前端站)同時經過web api的方式調用「Miidy.Cloud.RestWeb」 web服務,以達到先後端代碼分離的方式(詳情請查看麥荻網教系統的安裝部署文檔)。由於「Miidy.Cloud.Manage」站只開放給具有管理權限的用戶,故除了在前端增長控制外,還需在「Miidy.Cloud.RestWeb」 web服務內進行權限控制。那麼,如何在「Miidy.Cloud.RestWeb」 web服務內根據用戶實現權限控制呢?html
IActionFilter前端
在「Miidy.Cloud.RestWeb」程序內,咱們將藉助IActionFilter接口來實現請求的攔截。該接口提供了兩個方法(官網文檔)分別爲:OnActionExecuted(Action執行後)、OnActionExecuting(Action執行前)。根據需求,咱們實現OnActionExecuting便可。web
Attribute後端
咱們再借助「Attribute」屬性特性,可幫助咱們在「Miidy.Cloud.RestWeb」指定的方法內按需使用攔截器,這樣即可很方便的達到權限控制的目的。api
實現架構
如上面所述,咱們已經清楚了整個實現思路,那麼下面就來看看「Miidy.Cloud.RestWeb」程序攔截器的代碼實現吧:mvc
一、首先咱們先建立一個名爲「ManageVerifyAttribute」的攔截器類,命名以「Attribute」結尾,並繼承「Attribute」類,與實現「IActionFilter」。並在OnActionExecuting方法內寫入業務代碼。具體代碼以下:async
1 2 namespace Miidy.Cloud.Provider 3 { 4 /// <summary> 5 /// 該過慮器提供給全部對外的RestApi接口使用 6 /// 在有須要驗證每一個接口/方法是否只爲管理人員用戶調用時使用 7 /// 方法級別的過率器 8 /// </summary> 9 public class ManageVerifyAttribute : Attribute, IActionFilter 10 { 11 public void OnActionExecuted(ActionExecutedContext context) 12 { 13 } 14 15 /// <summary> 16 /// 判斷用戶是否爲管理角色,不是則拋出異常 17 /// </summary> 18 /// <param name="context"></param> 19 public void OnActionExecuting(ActionExecutingContext context) 20 { 21 if (context.HttpContext.User.Identity.IsAuthenticated) 22 { 23 var roleType = int.Parse(context.HttpContext.User.Claims.First(c => c.Type == "roleType").Value); 24 //不是管理人員 25 if (roleType <= 0 || roleType >= 4) 26 { 27 context.Result = new JsonResult(new Result(214)); 28 } 29 } 30 else 31 context.Result = new JsonResult(new Result(214)); 32 } 33 34 } 35 } 36
二、在Web Api的方法內打上[ManageVerify]屬性,便可完成攔截器的功能實現了,具體以下:ide
1 2 /// <summary> 3 /// 同步單個數據,數據不存在則增長,不然修改 4 /// </summary> 5 /// <param name="ids"></param> 6 /// <returns></returns> 7 [Route("SynchrDataByModel")] 8 [HttpPost] 9 [ManageVerify] 10 public async Task<Result> SynchrDataByModel(MC_Ware model) 11 { 12 var resul = await _WareCore.SynchrDataAsync(new List<MC_Ware> { model }); 13 if (resul <= 0) 14 return new Result(211); 15 return new Result(200); 16 }
總結spa
一、基於「IActionFilter」接口來實現請求的攔截。
二、基於「Attribute」屬性特性可幫助咱們能夠按需在指定WebApi方法內使用攔截器。
聲明
本文爲做者原創,轉載請備註出處與保留原文地址,謝謝。如文章能給您帶來幫助,請點下推薦或關注,感謝您的支持!