• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > 详解ABP框架的参数有效性验证和权限验证

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

作者:阳光铭睿 字体:[增加 减小] 来源:互联网 时间:2017-05-11

阳光铭睿通过本文主要向大家介绍了abp框架,abp框架源码,abp框架是什么,abp 263,苏泊尔vj28abp01等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

参数有效性验证
应用程序的输入数据首先应该被检验是否有效。输入的数据能被用户或其他应用程序提交。在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; }
}

</div>

在这里,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)</div>

设置缺省值
在检验数据有效性后,我们需要执行一个额外的操作来整理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";
    }
  }
}

</div>


权限验证
几乎所有的企业级应用程序都会有不同级别的权限验证。权限验证是用于检查用户是否允许某些指定操作。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");
  }
}

</div>

IPermissionDefinitionContext 有方法去获取和创建权限。

一个权限有以下属性:

  • Name:系统范围内的唯一名字。把它定义为一个字符串常量是个不错的注意。我们倾向于将“.”分割不同的层级,但并不要求这么做。你可以设置你任何喜欢的名字。唯一的规则就是这个名字必须是唯一的。
  • Display Name:使用一个本地化的字符串去显示权限到UI。
  • Description:和Display Name类似。
  • IsGrantedByDefault:此权限是否授权给(已登陆)所有用户,除非显示指定。通常设置为False(默认值)。
  • MultiTenancySides:对租户应用程序,一个权限可以基于租户或者主机(原文:host)。这是个枚举标识,因此权限可以应用于不同方面(原文:Both Sides)。

一个权限可以有父权限和子权限。当然,这不会影响权限检查,它只是在UI层对权限归类有好处。创建authorizationprovider之后,我们应该在模块的PreIntialize方法对它进行注册。如下:

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

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.
}
</div>

没有获得“Administration.UserManagement.CreateUser”权限的用户不能够调用CreateUser。

AbpAuthorize 特性也检查当前用户是否登录 (使用 IAbpSession.UserId)。因此,如果我们将某个方法声明为AbpAuthorize 特性,它至少会检查用户是否登录。代码如下: [AbpAuthorize]

public void SomeMethod(SomeMethodInput input)
{
  //A user can not execute this metho



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • ABP框架中导航菜单的使用及JavaScript API获取菜单的方法
  • 解析ABP框架中的数据传输对象与应用服务
  • ABP框架中的日志功能完全解析
  • 详解ABP框架的参数有效性验证和权限验证
  • 解析ABP框架中的事务处理和工作单元
  • 详解ABP框架中的数据过滤器与数据传输对象的使用
  • 解析ABP框架领域层中的实体类与仓储类
  • 详解ABP框架中Session功能的使用方法
  • ABP框架的基础配置及依赖注入讲解
  • ABP框架的体系结构及模块系统讲解

相关文章

  • 2017-05-11asp.net(C#)禁止缓存文件不让文件缓存到客户端
  • 2017-05-11ASP.NET 6种常用数据库的连接方法
  • 2017-05-11.net SMTP发送Email实例(可带附件)
  • 2017-05-11ASp.net 文本框(TextBox)计算,判断输入的是否是数字
  • 2017-05-11用存储过程向数据库存值的具体实现
  • 2017-05-11ASP.NET书籍信息录入实现代码
  • 2017-05-11ASP.NET中的C#基础知识
  • 2017-05-11asp.net mvc4中bootstrap datetimepicker控件的使用
  • 2017-05-11asp.net+js实时奥运金牌榜代码第1/2页
  • 2017-05-11解读ASP.NET 5 & MVC6系列教程(4):核心技术与环境配置

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ASP.NET与ASP互通COOKIES的一点经验
    • ASP.NET实现License Key输入功能的小例子
    • ASP.NET 运行时错误: 没有为扩展名“.asax”注册的生成提供程序修正版
    • 在ASP.NET 2.0中操作数据之四十二:DataList和Repeater数据排序(一)
    • asp.net 防止SQL注入攻击
    • ASP.NET MVC5实现文件上传与地址变化处理(5)
    • ASP.NET 文件断点续传实现代码
    • ASP.NET 中文显示之两种解决方法
    • FileStreaReder和StreamReader两个类介绍
    • Asp.net_Table控件の单元格纵向合并示例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有