授权

介绍

  几乎所有的企业应用都在一定程度上使用授权。在应用中,授权用来检查用户是否允许执行一些特定的操作。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. BZOJ 1002: [FJOI2007]轮状病毒【生成树的计数与基尔霍夫矩阵简单讲解+高精度】

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5577  Solved: 3031[Submit][Statu ...

  2. [51nod1474]宝藏图

    有n堆宝藏,每一堆宝藏有一个挖掘所需要的时间ti,有一个价值qi. 现在是做一个宝藏图.这个宝藏图是这样的,宝藏图的形状是一棵二叉树,二叉树刚好有k个叶子结点,从n堆宝藏中选k堆放到二叉树的叶子结点上 ...

  3. Java大数应用

    1.大数加法 import java.math.BigInteger; import java.util.Scanner; public class Main { public static void ...

  4. 从零开始学习前端JAVASCRIPT — 2、JavaScript基础ES5

    1:ES5简介 ECMAScript 5.1 (或仅 ES5) 是ECMAScript(基于JavaScript的规范)标准的修正. 与HTML5规范进程本质类似,ES5通过对现有JavaScript ...

  5. SSL证书安装指引

    https://cloud.tencent.com/document/product/400/4143 下载得到的 www.domain.com.zip 文件,解压获得3个文件夹,分别是Apache. ...

  6. thinkphp发送邮件需要开启什么设置

    邮件配置 'THINK_EMAIL' => array( 'SMTP_HOST' => 'smtp.163.com', //SMTP服务器 'SMTP_PORT' => '465', ...

  7. IIS  发布  dedecms  网站教程

    这里只是说明了配置 php 前后 iis 默认网站属性的变化,其实在配置完 php 后系统的环境变 量等也是发生了相应的变化了的, 这里就不一一列举了, 这些只有在你手动完成 php 的配置 之后才能 ...

  8. “此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题的解决

    虚拟机使用的是VMware Workstation,并且首次在虚拟机体验64 位系统.在新建好虚拟机,运行时候就出现了VMware Workstation 的提醒:此主机支持 Intel VT-x,但 ...

  9. 【编程技巧】Ext.MessageBox 大集合 不同的dialog图解加写法

    1.alert对话框 效果图: function a1(){ Ext.MessageBox.alert('title','text');  } 2.confirm案例,确定不确定2个按钮对话框 效果图 ...

  10. Java中的对象Object方法之---wait()和notifiy()

    这一篇咋们继续,接着来介绍wait()和notify()方法,我们都知道这两个方法和之前介绍的方法不太一样,那就是这两个方法是对象Object上的,不属于Thread类上的.我们也知道这两个方法是实现 ...