详解ABP框架的参数有效性验证和权限验证_.docx

上传人:PIYPING 文档编号:11587021 上传时间:2021-08-25 格式:DOCX 页数:13 大小:16.23KB
返回 下载 相关 举报
详解ABP框架的参数有效性验证和权限验证_.docx_第1页
第1页 / 共13页
详解ABP框架的参数有效性验证和权限验证_.docx_第2页
第2页 / 共13页
详解ABP框架的参数有效性验证和权限验证_.docx_第3页
第3页 / 共13页
详解ABP框架的参数有效性验证和权限验证_.docx_第4页
第4页 / 共13页
详解ABP框架的参数有效性验证和权限验证_.docx_第5页
第5页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《详解ABP框架的参数有效性验证和权限验证_.docx》由会员分享,可在线阅读,更多相关《详解ABP框架的参数有效性验证和权限验证_.docx(13页珍藏版)》请在三一文库上搜索。

1、详解ABP框架的参数有效性验证和权限验证_ 参数有效性验证 应用程序的输入数据首先应当被检验是否有效。输入的数据能被用户或其他应用程序提交。在Web应用中,通常进行2次数据有效性检验:包括客户端检验和服务端检验。客户端的检验主要是用法户有一个好的用户体验。 首先最好是在客户端检验其表单输入的有效性并且展现给客户端的那些字段输入是无效的。但是,服务器端的校验是更关键和不行缺失的(不要只做客户端检验而不做服务器端检验)。 服务器端的检验通常是被应用服务(层)执行,应用服务(层)中的方法首先检验数据的有效性,然后才用法这些通过验证的数据。ABP的基础设施供应了自动检验输入数据有效性的方法。 应用服务

2、(层)方法得到一个数据传输对象(DTO)作为输入。ABP有一个IValidate的接口,DTO通过实现这个接口能够检验数据的有效性。由于IInputDto扩展自IValidate,所以你可以挺直实现IInputDto 接口来对数据传输对象(DTO)检验其有效性。 用法数据注解 ABP供应数据注解的特性。假设我们正在开发一个创建任务的应用服务并且得到了一个输入,请看下面示例: public class CreateTaskInput : IInputDto public int? AssignedPersonId get; set; Required public string Descript

3、ion get; set; 在这里,Description 属性被标记为 Required。AssignedPersonId 是可选的。在 System.ComponentModel.DataAnnotations 命名空间中,还有许多这样的特性 ( 例如: MaxLength, MinLength, RegularExpression 等等 )。 在System.ComponentModel.DataAnnotations 命名空间中,请看Task application service 的实现 public class TaskAppService : ITaskAppService pr

4、ivate readonly ITaskRepository _taskRepository; private readonly IPersonRepository _personRepository; public TaskAppService(ITaskRepository taskRepository, IPersonRepository personRepository) _taskRepository = taskRepository; _personRepository = personRepository; public void CreateTask(CreateTaskInp

5、ut 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。假如为空则会抛出AbpVa

6、lidationException 特别。所以你不需要写检验数据是否为null值的代码。假如有任何属性的输入数据是无效的它也会抛出相同的特别。 这个机制近似于 ASP.NET MVC 的验证功能,留意:这里的应用服务类不是继承自Controller,它是用在Web应用的一个一般类。 自定义检验 假如数据注解的方式不能满足你的需求,你可以实现ICustomValidate接口,请看下面示例: public class CreateTaskInput : IInputDto, ICustomValidate public int? AssignedPersonId get; set; public

7、 bool SendEmailToAssignedPerson get; set; Required public string Description get; set; public void AddValidationErrors(ListValidationResult results) if (SendEmailToAssignedPerson (!AssignedPersonId.HasValue | AssignedPersonId.Value = 0) results.Add(new ValidationResult(AssignedPersonId must be set i

8、f SendEmailToAssignedPerson is true!); ICustomValidate 接口声明白一个可被实现的AddValidationErrors方法。这里我们有一个叫做 SendEmailToAssignedPerson 的属性。假如该属性是真,AssignedPersonId 属性会被检验是否有效,否则该属性可以为空。假如有验证错误,我们必需添加把这些验证结果添加到结果集合中。(就是将ValidationResult 添加到results) 设置缺省值 在检验数据有效性后,我们需要执行一个额外的操作来整理DTO参数。ABP定义了一个IShouldNormalize

9、接口,这个接口声明白一个 Normalize的方法。假如你实现了这个接口,在检验数据有效性后,Normalize方法会被调用。假设我们的DTO需要一个排序方向的数据。假如这个Sorting属性没有被供应数据,那么在Normalize我们可以给Sorting设置一个缺省值。 public class GetTasksInput : IInputDto, IShouldNormalize public string Sorting get; set; public void Normalize() if (string.IsNullOrWhiteSpace(Sorting) Sorting = N

10、ame ASC; 权限验证 几乎全部的企业级应用程序都会有不同级别的权限验证。权限验证是用于检查用户是否允许某些指定操作。Abp有基础设施让你来实现权限验证。 留意:关于IPermissionChecker接口 Abp权限系统用法IPermissionChecker去检查授权。同时你可以依据需要实现你自己的方式,在module-zero项目中已经完整实现了。假如IPermissionChecker没有被实现,NullPermissionChecker会被用法于授权全部权限给每个人。 定义权限 在用法验证权限前,我们需要为每一个操作定义唯一的权限。Abp的设计是基于模块化,所以不同的模块可以有不

11、同的权限。为了定义权限,一个模块应当创建AuthorizationProvider的派生类。MyAuthorizationProvider继承自AuthorizationProvider,换句话说就是AuthorizationProvider派生出MyAuthorizationProvider。例子如下: public class MyAuthorizationProvider : AuthorizationProvider public override void SetPermissions(IPermissionDefinitionContext context) var adminis

12、tration = context.CreatePermission(Administration); var userManagement = administration.CreateChildPermission(Administration.UserManagement); userManagement.CreateChildPermission(Administration.UserManagement.CreateUser); var roleManagement = administration.CreateChildPermission(Administration.RoleM

13、anagement); IPermissionDefinitionContext 有方法去猎取和创建权限。 一个权限有以下属性: 1.Name:系统范围内的唯一名字。把它定义为一个字符串常量是个不错的留意。我们倾向于将“.”分割不同的层级,但并不要求这么做。你可以设置你任何喜爱的名字。唯一的规章就是这个名字必需是唯一的。 2.Display Name:用法一个本地化的字符串去显示权限到UI。 3.Description:和Display Name类似。 4.IsGrantedByDefault:此权限是否授权给(已登陆)全部用户,除非显示指定。通常设置为False(默认值)。 5.MultiT

14、enancySides:对租户应用程序,一个权限可以基于租户或者主机(原文:host)。这是个枚举标识,因此权限可以应用于不同方面(原文:Both Sides)。 一个权限可以有父权限和子权限。当然,这不会影响权限检查,它只是在UI层对权限归类有好处。创建authorizationprovider之后,我们应当在模块的PreIntialize方法对它进行注册。如下: Configuration.Authorization.Providers.AddMyAuthorizationProvider() authorizationprovider会自动注册到依靠注入系统中。因此,authorizat

15、ion provider可以注入任何依靠(像是Repository)从而用法其他资源去创建权限定义。 检查权限 1.用法AbpAuthorize特性(Using AbpAuthorize attribute) AbpAuthorize(AbpMvcAuthorize 对应 MVC Controllers and AbpApiAuthorize 对应 Web API Controllers)特性是最简洁和常用的方法去检查权限。请考虑如下application service方法: AbpAuthorize(Administration.UserManagement.CreateUser) pub

16、lic 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)。因此,假如我们将某个方法声明为AbpAuthor

17、ize 特性,它至少会检查用户是否登录。代码如下: 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)

18、类(我们必需用依靠注入)。 此外, AbpAuthorize特性可以应用于任何的Public方法,假如此方法被接口调用(比如在Application Services中通过接口调用) 方法是虚(virtual)方法,假如此方法挺直被类引用进行调用(像是ASP.NET MVC 或 Web API 的掌握器)。 方式是虚(virtual)方法,假如此方法是protected。 留意:有三种AbpAuthorize 特性: (1)在应用程序服务中(application layer),我们用法Abp.Authorization.AbpAuthorize; (2)在MVC掌握器(web layer)中

19、,我们用法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 适用于大部分的状况,

20、但是某些状况下,我们还是需要自己在方法体里进行权限验证。我们可以注入和用法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

21、 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类用法,而不需要显示注入。 .

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1