亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

詳解ABP框架的參數有效性驗證和權限驗證

2024-07-10 13:30:46
字體:
來源:轉載
供稿:網友

參數有效性驗證
應用程序的輸入數據首先應該被檢驗是否有效。輸入的數據能被用戶或其他應用程序提交。在Web應用中,通常進行2次數據有效性檢驗:包括客戶端檢驗和服務端檢驗。客戶端的檢驗主要是使用戶有一個好的用戶體驗。 首先最好是在客戶端檢驗其表單輸入的有效性并且展示給客戶端的那些字段輸入是無效的。但是,服務器端的校驗是更關鍵和不可缺失的(不要只做客戶端檢驗而不做服務器端檢驗)。

服務器端的檢驗通常是被應用服務(層)執行,應用服務(層)中的方法首先檢驗數據的有效性,然后才使用這些通過驗證的數據。ABP的基礎設施提供了自動檢驗輸入數據有效性的方法。

應用服務(層)方法得到一個數據傳輸對象(DTO)作為輸入。ABP有一個IValidate的接口,DTO通過實現這個接口能夠檢驗數據的有效性。由于IInputDto擴展自IValidate,所以你可以直接實現IInputDto 接口來對數據傳輸對象(DTO)檢驗其有效性。

使用數據注解
ABP提供數據注解的特性。假設我們正在開發一個創建任務的應用服務并且得到了一個輸入,請看下面示例:

public class CreateTaskInput : IInputDto{  public int? AssignedPersonId { get; set; }  [Required]  public string Description { get; set; }}

在這里,Description 屬性被標記為 Required。AssignedPersonId 是可選的。在 System.ComponentModel.DataAnnotations 命名空間中,還有很多這樣的特性 ( 例如: MaxLength, MinLength, RegularExpression 等等 )。

在System.ComponentModel.DataAnnotations 命名空間中,請看Task application service 的實現

 

public class TaskAppService : ITaskAppService{  private readonly ITaskRepository _taskRepository;  private readonly IPersonRepository _personRepository;  public TaskAppService(ITaskRepository taskRepository, IPersonRepository personRepository)  {    _taskRepository = taskRepository;    _personRepository = personRepository;  }  public void CreateTask(CreateTaskInput input)  {    var task = new Task { Description = input.Description };    if (input.AssignedPersonId.HasValue)    {      task.AssignedPerson = _personRepository.Load(input.AssignedPersonId.Value);    }    _taskRepository.Insert(task);  }}

 


正如你所看到的,這里沒有寫任何的數據驗證性代碼(指對Description屬性的驗證)因為ABP會自動去檢驗數據的有效性。ABP也會檢驗輸入數據是否為null。如果為空則會拋出AbpValidationException 異常。所以你不需要寫檢驗數據是否為null值的代碼。如果有任何屬性的輸入數據是無效的它也會拋出相同的異常。

這個機制近似于 ASP.NET MVC 的驗證功能,注意:這里的應用服務類不是繼承自Controller,它是用在Web應用的一個普通類。

自定義檢驗
如果數據注解的方式不能滿足你的需求,你可以實現ICustomValidate接口,請看下面示例:

public class CreateTaskInput : IInputDto, ICustomValidate{  public int? AssignedPersonId { get; set; }  public bool SendEmailToAssignedPerson { get; set; }  [Required]  public string Description { get; set; }  public void AddValidationErrors(List<ValidationResult> results)  {    if (SendEmailToAssignedPerson && (!AssignedPersonId.HasValue || AssignedPersonId.Value <= 0))    {      results.Add(new ValidationResult("AssignedPersonId must be set if SendEmailToAssignedPerson is true!"));    }  }}

ICustomValidate 接口聲明了一個可被實現的AddValidationErrors方法。這里我們有一個叫做 SendEmailToAssignedPerson 的屬性。如果該屬性是真,AssignedPersonId 屬性會被檢驗是否有效,否則該屬性可以為空。如果有驗證錯誤,我們必須添加把這些驗證結果添加到結果集合中。(就是將ValidationResult 添加到results)

設置缺省值
在檢驗數據有效性后,我們需要執行一個額外的操作來整理DTO參數。ABP定義了一個IShouldNormalize接口,這個接口聲明了一個 Normalize的方法。如果你實現了這個接口,在檢驗數據有效性后,Normalize方法會被調用。假設我們的DTO需要一個排序方向的數據。如果這個Sorting屬性沒有被提供數據,那么在Normalize我們可以給Sorting設置一個缺省值。

public class GetTasksInput : IInputDto, IShouldNormalize{  public string Sorting { get; set; }  public void Normalize()  {    if (string.IsNullOrWhiteSpace(Sorting))    {      Sorting = "Name ASC";    }  }}


權限驗證
幾乎所有的企業級應用程序都會有不同級別的權限驗證。權限驗證是用于檢查用戶是否允許某些指定操作。Abp有基礎設施讓你來實現權限驗證。

注意:關于IPermissionChecker接口

Abp權限系統使用IPermissionChecker去檢查授權。同時你可以根據需要實現你自己的方式,在module-zero項目中已經完整實現了。如果IPermissionChecker沒有被實現,NullPermissionChecker會被使用于授權所有權限給每個人。

定義權限
在使用驗證權限前,我們需要為每一個操作定義唯一的權限。Abp的設計是基于模塊化,所以不同的模塊可以有不同的權限。為了定義權限,一個模塊應該創建AuthorizationProvider的派生類。MyAuthorizationProvider繼承自AuthorizationProvider,換句話說就是AuthorizationProvider派生出MyAuthorizationProvider。例子如下:

public class MyAuthorizationProvider : AuthorizationProvider{  public override void SetPermissions(IPermissionDefinitionContext context)  {    var administration = context.CreatePermission("Administration");    var userManagement = administration.CreateChildPermission("Administration.UserManagement");    userManagement.CreateChildPermission("Administration.UserManagement.CreateUser");    var roleManagement = administration.CreateChildPermission("Administration.RoleManagement");  }}

IPermissionDefinitionContext 有方法去獲取和創建權限。

一個權限有以下屬性:

  • Name:系統范圍內的唯一名字。把它定義為一個字符串常量是個不錯的注意。我們傾向于將“.”分割不同的層級,但并不要求這么做。你可以設置你任何喜歡的名字。唯一的規則就是這個名字必須是唯一的。
  • Display Name:使用一個本地化的字符串去顯示權限到UI。
  • Description:和Display Name類似。
  • IsGrantedByDefault:此權限是否授權給(已登陸)所有用戶,除非顯示指定。通常設置為False(默認值)。
  • MultiTenancySides:對租戶應用程序,一個權限可以基于租戶或者主機(原文:host)。這是個枚舉標識,因此權限可以應用于不同方面(原文:Both Sides)。

一個權限可以有父權限和子權限。當然,這不會影響權限檢查,它只是在UI層對權限歸類有好處。創建authorizationprovider之后,我們應該在模塊的PreIntialize方法對它進行注冊。如下:

Configuration.Authorization.Providers.Add<MyAuthorizationProvider>()

authorizationprovider會自動注冊到依賴注入系統中。因此,authorization provider可以注入任何依賴(像是Repository)從而使用其他資源去創建權限定義。

檢查權限
1.使用AbpAuthorize特性(Using AbpAuthorize attribute)

AbpAuthorize(AbpMvcAuthorize 對應 MVC Controllers and AbpApiAuthorize 對應 Web API Controllers)特性是最簡單和常用的方法去檢查權限。請考慮如下application service方法:

[AbpAuthorize("Administration.UserManagement.CreateUser")]public void CreateUser(CreateUserInput input){  //A user can not execute this method if he is not granted for "Administration.UserManagement.CreateUser" permission.}

沒有獲得“Administration.UserManagement.CreateUser”權限的用戶不能夠調用CreateUser。

AbpAuthorize 特性也檢查當前用戶是否登錄 (使用 IAbpSession.UserId)。因此,如果我們將某個方法聲明為AbpAuthorize 特性,它至少會檢查用戶是否登錄。代碼如下: [AbpAuthorize]

public void SomeMethod(SomeMethodInput input){  //A user can not execute this method if he did not login.}

2.AbpAuthorize屬性說明(AbpAuthorize attribute notes)

Abp使用動態方法攔截進行權限驗證。因此,使用AbpAuthorize特性的方法會有些限制。如下:

不能應用于私有(private)方法
不能應用于靜態(static)方法
不能應用于非注入(non-injected)類(我們必須用依賴注入)。
此外,

AbpAuthorize特性可以應用于任何的Public方法,如果此方法被接口調用(比如在Application Services中通過接口調用)
方法是虛(virtual)方法,如果此方法直接被類引用進行調用(像是ASP.NET MVC 或 Web API 的控制器)。
方式是虛(virtual)方法,如果此方法是protected。
注意:有三種AbpAuthorize 特性:

(1)在應用程序服務中(application layer),我們使用Abp.Authorization.AbpAuthorize;
(2)在MVC控制器(web layer)中,我們使用Abp.Web.Mvc.Authorization.AbpMvcAuthorize;
(3)在ASP.NET Web API,我們使用 Abp.WebApi.Authorization.AbpApiAuthorize。
這三個類繼承自不同的地方。

在MVC中,它繼承自MVC自己的Authorize類。
在Web API,它繼承自Web API 的Authorize類。因此,它最好是繼承到MVC和Web API中。
但是,在Application 層,它完全是由Abp自己實現沒有擴展子任何類。
3.使用IPermissionChecker

AbpAuthorize 適用于大部分的情況,但是某些情況下,我們還是需要自己在方法體里進行權限驗證。我們可以注入和使用IPermissionChecker對象。如下邊的代碼所示:

 public void CreateUser(CreateOrUpdateUserInput input){  if (!PermissionChecker.IsGranted("Administration.UserManagement.CreateUser"))  {    throw new AbpAuthorizationException("You are not authorized to create user!");  }  //A user can not reach this point if he is not granted for "Administration.UserManagement.CreateUser" permission.}

 當然,你可以寫入任何邏輯,由于IsGranted方法只是簡單返回true或false(它還有異步版本哦)。如你簡單的檢查一個權限并拋出一個異常如上邊代碼那樣,你可以用Authorize方法:

public void CreateUser(CreateOrUpdateUserInput input){  PermissionChecker.Authorize("Administration.UserManagement.CreateUser");  //A user can not reach this point if he is not granted for "Administration.UserManagement.CreateUser" permission.}

由于權限驗證通常實現與Application層,ApplicationService基礎類注入和定義了PermissionChecker屬性。因此,權限檢查器允許你在Application Service類使用,而不需要顯示注入。


注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩精品久久奇米色影视| 国产精品久久久久久av福利| 欧美日韩中文字幕综合视频| 久久久久久久久久久av| 亚洲国产一区二区三区在线观看| 国产一区私人高清影院| 中文字幕亚洲综合久久| 理论片在线不卡免费观看| 欧美剧在线观看| 黄色精品在线看| 国产精品综合久久久| 欧美极品在线视频| 欧美孕妇孕交黑巨大网站| 精品国产成人在线| 91视频国产精品| 免费成人高清视频| 久久在线视频在线| 91伊人影院在线播放| 久99九色视频在线观看| 伊人青青综合网站| 伊人久久大香线蕉av一区二区| 国产精品入口日韩视频大尺度| 2020国产精品视频| 国产z一区二区三区| 久久精品成人欧美大片| 国产精品人成电影在线观看| 北条麻妃在线一区二区| 欧美成人中文字幕在线| 欧美wwwwww| 国产欧美一区二区白浆黑人| 91精品国产综合久久久久久久久| 一区二区三区久久精品| 免费不卡欧美自拍视频| 国产欧美久久久久久| 亚洲精品免费一区二区三区| 亚洲人成网站在线播| 日韩精品在线免费播放| 茄子视频成人在线| 久久人91精品久久久久久不卡| 在线免费看av不卡| 日韩精品免费电影| 日韩高清电影好看的电视剧电影| 日韩中文字幕在线精品| 久久香蕉频线观| 亚洲经典中文字幕| 亚洲jizzjizz日本少妇| 欧美老女人www| 久久国产精品视频| 草民午夜欧美限制a级福利片| 亚洲曰本av电影| 麻豆精品精华液| 欧美精品一二区| 精品久久久久久久久久久| 中文字幕日韩免费视频| 久久亚洲国产精品成人av秋霞| 精品国产精品三级精品av网址| 久久不射热爱视频精品| 亚洲精品资源美女情侣酒店| 国产午夜精品美女视频明星a级| 亚洲欧美国产一区二区三区| 视频一区视频二区国产精品| 欧美电影免费观看网站| 亚洲精品久久7777777| 国产精品亚洲激情| 亚洲欧美一区二区精品久久久| 欧美性生活大片免费观看网址| 91色精品视频在线| 精品国产欧美一区二区三区成人| 国产精品自产拍在线观| 日韩精品在线观| 国产成人亚洲综合青青| 国产成人黄色av| 久久99热精品这里久久精品| 欧美激情图片区| 欧美日韩国产限制| 7m第一福利500精品视频| 欧美疯狂性受xxxxx另类| 亚洲人在线视频| 国产成人在线一区| 亚洲欧美日韩中文在线制服| 91午夜在线播放| 精品毛片三在线观看| 91精品国产综合久久香蕉最新版| 欧美日韩精品在线观看| 中文字幕久久久av一区| 91av成人在线| 欧美成人性色生活仑片| 韩国视频理论视频久久| 欧美性猛交xxxx富婆弯腰| 成人久久久久久久| 亚洲深夜福利视频| 亚洲自拍偷拍色图| 亚洲国产91精品在线观看| 国产精品一区二区三区毛片淫片| 国产精品老牛影院在线观看| 亚洲片av在线| 欧美国产第一页| 成人网在线免费看| 欧美人与物videos| 欧美精品做受xxx性少妇| 亚洲丝袜av一区| 91色中文字幕| 亚洲午夜久久久久久久| 亚洲成人网久久久| 国产精品老牛影院在线观看| 欧美午夜激情在线| 亚洲人成电影在线| 亚洲精品www久久久| 法国裸体一区二区| 色噜噜狠狠狠综合曰曰曰| 国产精品久久久久久超碰| 日本午夜精品理论片a级appf发布| 亚洲а∨天堂久久精品喷水| 国产成人精品网站| 欧美精品999| 久久成人精品电影| 欧美一级电影久久| 91美女片黄在线观看游戏| 精品无人区乱码1区2区3区在线| 7777精品久久久久久| 国产精品一区二区久久久| 亚洲综合最新在线| 国产精品情侣自拍| 日韩av三级在线观看| 91理论片午午论夜理片久久| 亚洲欧美国产精品专区久久| 国内精品久久久久伊人av| 国产中文字幕日韩| 亚洲欧洲视频在线| 欧美人交a欧美精品| 国产精品你懂得| 久久亚洲私人国产精品va| zzjj国产精品一区二区| 国产不卡av在线免费观看| 国产一区二区三区直播精品电影| 欧美成人国产va精品日本一级| 超碰日本道色综合久久综合| 中文字幕一区日韩电影| 色婷婷综合久久久久| 国产午夜精品久久久| 97在线精品国自产拍中文| 欧美精品国产精品日韩精品| 日韩视频在线免费观看| 亚洲精品电影网站| 色偷偷偷综合中文字幕;dd| 成人免费观看网址| 国产精品日本精品| 国产精品88a∨| 欧美精品久久一区二区| 78m国产成人精品视频| 久久电影一区二区| 在线看欧美日韩| 国产精品草莓在线免费观看| 亚洲福利视频网| 国产99视频在线观看| 青青草99啪国产免费| 久久青草福利网站| 久久综合伊人77777尤物| 亚洲最新av网址| 精品成人av一区| 7777精品视频| 久久69精品久久久久久久电影好| 欧美一区二区三区……| 欧美亚洲国产日韩2020|