授权

介绍

  几乎所有的企业应用都在一定程度上使用授权。在应用中,授权用来检查用户是否允许执行一些特定的操作。ABP定义了一个基础的权限设施来实现授权。

关于IPermissionChecker

  授权系统使用IPermissionChecker来检查权限。你可以使用自己的方式实现它时,但它已经在modul-zero工程里完全实现了。NullPermissionChecker用来将所有的权限赋给所有的人。

定义权限

  每一个需要授权的操作都需要定义一个唯一的权限。我们应该先定义权限再使用。ABP设计为模块的。所以,不同的模块可以有不同的权限。模块应该创建一个继承AuthorizationProvider的类以便定义它的权限。授权提供者的示例如下:

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:系统范围内的唯一名称。最好使用静态字符串定义权限名称而不使用魔法字符串。我们倾向于使用.(dot)符号来定义层级名称,但这不是必须的。你可以设置任何你喜欢的名称,唯一的规则就是它的名字必须唯一。
  • DisplayName:一个本地化字符串,用来在UI中显示权限。
  • Description:一个本地化字符串,用来在UI中显示权限的定义。
  • MultiTenancySides:对于多租户应用,一个权限可以被租户或租主使用。这是一个Flags枚举,从而权限可以在两端使用。
  • FeatureDependency:可以用来声明特征的一个依赖。从而,权限只有在特征依赖满足的情况下赋予。它需要一个实现了IFeatureDependency接口的对象。默认的实现类是SimpleFeatureDependency。示例用法:
    new SimpleFeatureDependency("MyFeatureName")

  一个权限可以有父或子权限。这并不影响权限校验,但有助于在UI层将权限分组。

  创建一个授权提供者之后,我们应该在模块的PreInitialize方法中注册它:

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

  授权提供者自动注册到依赖注入系统。所以,授权提供者可以注入任何依赖来使用一些其他资源创建权限定义。

检查权限

使用AbpAuthorize特性

  AbpAuthorize(MVC控制器为AbpMvcAuthorize,Web API控制器为AbpApiAuthorize)是最简单和通用的检查权限的方式。考虑下面的应用服务方法:

[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.
}

  CreateUser方法不能被没有“Administration.UserManagement.CreateUser”权限的用户调用。

  AbpAuthorize特性也检查当前用户是否已登录(使用IAbpSession.UserId)。所以,如果我们为一个方法声明了AbpAuthorize,那ABP只检查是否登录:

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

AbpAuthorize特性注意点

  ABP使用动态方法来实现权限拦截。所以,使用AbpAuthorize特性有一些限制:

  • 不能用于私有方法。
  • 不能用于静态方法。
  • 不能用于non-injected类的方法(我们必须使用依赖注入)。

  还有,

  • 可以用于任何通过接口调用的公共方法(如应用服务使用接口调用)。
  • 方法应该为虚方法,如果它被直接从引用类调用(如ASP.NET MVC或Web API控制器)。
  • 方法应该为虚方法,如果它是protected

  注意:authorize特性有四种类型:

  • 在应用服务中(应用层),我们使用Abp.Authorization.AbpAuthorize特性。
  • 在MVC控制器中(网络层),我们使用Abp.Web.Mvc.Authorization.AbpMvcAuthorization特性。
  • 在ASP.NET Web API中,我们使用Abp.WebApi.Authorization.AbpApiAuthorize特性。
  • 在ASP.NET Core中,我们使用Abp.AspNetCore.Mvc.Authorization.AbpMvcAuthorize特性。

  这些不同起源于继承。在应用层,它完全由ABP实现,没有扩展任何类。但是,在MVC和WebAPI,它继承自这些框架的特性。  

抑制授权

  你可以通过给应用服务添加AbpAllowAnonymous特性来禁用方法或类的授权。MVC、Web API和ASP.NET Core控制器使用AllowAnonymous特性,它是这些框架的本地特性。

使用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.
}

  因为授权被广泛使用。ApplicationServe和一些其他的基类注入并定义了PermissionChecker属性。因此,在应用服务类,权限检查不用注入就可以使用。

在Razor视图

  基础视图类定义了IsGranted方法检查当前用户是否有权限。因此,我们可以有条件的渲染视图。示例:

@if (IsGranted("Administration.UserManagement.CreateUser"))
{
<button id="CreateNewUserButton" class="btn btn-primary"><i class="fa fa-plus"></i> @L("CreateNewUser")</button>
}

客户端(Javascript)

  在客户端,我们可以使用在abp.auth命名空间定义的API。在大多数情况下,我们需要检查当前用户是否有一个指定的权限(使用权限名称)。示例:

abp.auth.isGranted('Administration.UserManagement.CreateUser');

  你也可以使用abp.auth.grantedPermissions获取所有授权的权限或abp.auth.allPermissions获取所有在应用中可用的权限。Check abp.auth namespace on runtime for others.

权限管理

  我们或许需要权限的定义,这种情况下可以使注入并使用IPermissonManager接口来达到目的。

返回主目录

ABP官方文档翻译 4.4 授权的更多相关文章

  1. ABP官方文档翻译 4.5 特征管理

    特征管理 介绍 关于IFeatureValueStore 特征类型 Boolean特征 Value特征 定义特征 基本特征属性 其他特征属性 特征层级 检查特征 使用RequiresFeature特性 ...

  2. ABP官方文档翻译 10.1 ABP Nuget包

    ABP Nuget包 Packages Abp Abp.AspNetCore Abp.Web.Common Abp.Web Abp.Web.Mvc Abp.Web.Api Abp.Web.Api.OD ...

  3. ABP官方文档翻译 7.2 Hangfire集成

    Hangfire集成 介绍 ASP.NET Core集成 ASP.NET MVC 5.x集成 面板授权 介绍 Hangfire是一个综合的后台job管理器.你可以 把它集成到ABP,用来取代默认的后台 ...

  4. ABP官方文档翻译 6.7 CSRF/XSRF保护

    CSRF/XSRF保护 介绍 HTTP动词 非浏览器客户端 ASP.NET MVC 特征 集成 布局视图 配置 ASP.NET Web API 特征 集成 集成到ASP.NET MVC客户端 集成到其 ...

  5. ABP官方文档翻译 6.4 导航

    导航 创建菜单 注册导航提供者 显示菜单 每一个网络应用都会有一些菜单用来在pages/screens之间导航.ABP提供了通用的基础设施来创建并显示菜单. 创建菜单 应用可以由不同的模块组成,每一个 ...

  6. ABP官方文档翻译 6.2.1 ASP.NET Core集成

    ASP.NET Core 介绍 迁移到ASP.NET Core? 启动模板 配置 启动类 模块配置 控制器 应用服务作为控制器 过滤器 授权过滤器 审计Action过滤器 校验过滤器 工作单元Acti ...

  7. ABP官方文档翻译 6.1.2 MVC视图

    ASP.NET MVC 视图 介绍 AbpWebViewPage基类 介绍 ABP通过Abp.Web.Mvc nuget包集成到MVC视图.你可以如往常一样创建正常的MVC视图. AbpWebView ...

  8. ABP官方文档翻译 6.1.1 MVC控制器

    ASP.NET MVC控制器 介绍 AbpController基类 本地化 其他 过滤器 异常处理和结果包装 审计日志 验证 授权 工作单元 介绍 ABP通过Abp.Web.Mvc nuget包集成到 ...

  9. ABP官方文档翻译 5.1 Web API控制器

    ASP.NET Web API控制器 介绍 AbpApiController基类 本地化 其他 过滤器 审计日志 授权 反伪造过滤器 工作单元 结果包装和异常处理 结果缓存 校验 模型绑定器 介绍 A ...

随机推荐

  1. Codeforces 839D Winter is here【数学:容斥原理】

    D. Winter is here time limit per test:3 seconds memory limit per test:256 megabytes input:standard i ...

  2. 利用dfs解决规定路程问题

    今天继续dfs的训练,遇到了一道神题,不停地TLE,我DD都快碎了.....好在经过本渣不懈努力,还是弄了出来,不容易啊,发上来纪念一下,顺便总结一下关于用dfs解决规定路程的问题. 先上题目: De ...

  3. GDI绘制时钟效果,与系统时间保持同步,基于Winform

    2018年工作之余,想起来捡起GDI方面的技术,特意在RichCodeBox项目中做了两个示例程序,其中一个就是时钟效果,纯C#开发.这个CSharpQuartz是今天上午抽出一些时间,编写的,算是偷 ...

  4. Node类型知识大全

    Node类型 1.节点关系 每个节点都有一个childNodes属性,其中保存着一个NodeList对象.NodeList是一种类数组对象,用于保存一组有序的节点,可以通过位置来访问这些节点.请注意, ...

  5. phpmyadmin 自动登录的办法

    在本地开发php项目中,需要配合使用mysql在线管理系统phpmyadmin,因为经常使用,就不想每次都输入密码,所以想办法把用户名密码写入配置文件中,让每次都可以自动登录. 工具/原料   代码编 ...

  6. Rootkit 核心技术——利用 nt!_MDL(内存描述符链表)突破 SSDT(系统服务描述符表)的只读访问限制 Part I

    -------------------------------------------------------- 在 rootkit 与恶意软件开发中有一项基本需求,那就是 hook Windows ...

  7. Mac OS启动服务优化高级篇

    一.Mac下的启动服务主要三个可配置的地方 1.系统偏好设置->帐户->登陆项 2./System/Library/StartupItems 和 /Library/StartupItems ...

  8. [知了堂学习笔记]_ajax的两种使用方式

    一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待 卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都 ...

  9. Java中实例方法、类方法和构造方法

    类方法,有static修饰符,典型的主函数public static void main(String[] args){}实例方法,就是一般的方法构造方法,没有返回值(就是连void都没有),方法名与 ...

  10. FPGA上如何求32个输入的最大值和次大值:分治

    上午在论坛看到个热帖,里头的题目挺有意思的,简单的记录了一下. 0. 题目 在FPGA上实现一个模块,求32个输入中的最大值和次大值,32个输入由一个时钟周期给出.(题目来自论坛,面试题,如果觉得不合 ...