ABP框架 - 授权
本节内容:
简介
几乎所有的企业应用在某引起级别上使用授权。授权用来验证一个用户是否允许应用里的某些指定操作。
ABP定义了一个基于许可的基础构架来实现授权。
关于 IPermissionChecker
授权系统使用IPermissionChecker来检查许可,虽然你用自己的方式实现它,不过在module-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:一个系统域内的唯一名称,用一个字符串常量,不用可变的字符串,是一个好的做法。在分级里我们更喜欢用.(点)号来命名,但它不是必须的,你设置为你喜欢的名称,唯一的规则是一定要唯一。
- DisplayName:一个本地化的用来之后在UI上显示许可的文本。
- Description:一个本地化的用来之后在UI上显示许可描述的文本。
- MultiTenancySides:在多租户应用里,许可可被租户或宿主使用,这是一个标记性的枚举,所以一个许可可同时被租户和宿主使用。
- DependedFeature:用来表明一个对Feature(特色)的依赖,所以这个许可只有在满足Feature(特色)依赖时才会被允许。
一个许可可以有一个父许可和多个子许可,虽然这对于许可检查没有什么作用,但可能有助于在UI上组织许可。
创建一个授权供应器之后,我们应当在我们模块的预初始化方法里注册它:
Configuration.Authorization.Providers.Add<MyAuthorizationProvider>();
授权供应器被自动注册到依赖注入里,所以一个授权供应器可以注入任何的依赖(如一个仓储),从而可以使用其它的源来定义许可。
检查许可
使用 AbpAuthorize特性
AbpAuthorize(AbpMvcAuthorize用于Mvc控制器,AbpApiAuthorize用于Web Api控制器)特性,是使用许可最简单也是最常用的方式。假设有一个应用服务方法如下所示:
[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特性也检查当前用户是否已登录(使用IAbp.Session.UsrId),所以,如果我们为一个方法声明一个AbpAuthorize,它只用来检查用户是否已登录:
[AbpAuthorize]
public void SomeMethod(SomeMethodInput input)
{
//用户如果未登录,不能执行这个方法
}
AbpAuthorize特性注意事项
ABP为授权使用强大的动态方法拦截,所以对于使用AbpAuthorize特性的方法有些限制:
- 不能用于私有方法。
- 不能用于静态方法。
- 不能用于无注入的类里的方法(我们必须使用依赖注入)。
同时,可用于:
- 任何通过接口调用的public方法(如通过接口使用应用服务)。
- 一个直接通过类引用(如Asp.Net Mvc或Web Api控制器)调用的virtual方法。
- 一个protected virtual方法。
注意:有4类授权特性:
- 在一个应用服务里(应用层)里,我们使用Abp.Authorization.AbpAuthorize特性。
- 在一个Mvc控制器(web层)里,我们使用Abp.Web.Mvc.Authorization.AbpMvcAuthorize特性。
- 在一个Asp.net Web Api里,我们使用Abp.WebApi.Authorization.AbpApiAuthorization特性。
- 在一个Asp.net Core里,我们使用Abp.AspNetCore.Mvc.Authorization.AbpMvcAuthorize特性。
这些不同来自于继承,在应用层里,ABP完整地实现了,也没有扩展任何类,但是在Mvc和Web Api里,它从自身框架的Authorize特性继承。
废止授权
我们可以为应用服务添加AbpAllowAnonymous特性来禁用一个方法/类的授权,使用框架自身的AllowAnonymous特性来禁用Mvc、Web Api、Asp.net Core控制器的授权。
使用 IPermissionChecker
尽管AbpAuthorize特性能完美应对大部分情况,但有些情况我们必须要在方法内检查一个许可,这时我们可以注入并使用IPermissionChecker,如下所示:
public void CreateUser(CreateOrUpdateUserInput input)
{
if (!PermissionChecker.IsGranted("Administration.UserManagement.CreateUser"))
{
throw new AbpAuthorizationException("You are not authorized to create user!");
}
//一个用户如果没有经过“Administration.usermanagerment.CreateUser”许可的允许,是不可以到达这里的。
}
尽管IsGranted只是简单的返回true或false,但你也可以编写任何逻辑(IsGranted也有异步版本)。如果你像上面那样,只是简单的检查一个许可并抛出一个异常,你可以使用Authorize方法:
public void CreateUser(CreateOrUpdateUserInput input)
{
PermissionChecker.Authorize("Administration.UserManagement.CreateUser");
//一个用户如果没有经过“Administration.usermanagerment.CreateUser”许可的允许,是不可以到达这里的。
}
由于授权的广泛使用,ApplicationService和一些通用的基类注入并定义了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.allPerssions获取所有可用的许可名称。在运行时里查看abp.auth命名空间的其它API。
许可管理器
我们可能会用到许可的定义,这里可以注入并使用IPermissionManager。
ABP框架 - 授权的更多相关文章
- ABP框架 - 功能管理
文档目录 本节内容: 简介 关于 IFeatureValueStore 功能类型 Boolean 功能 Value 功能 定义功能 基本功能属性 其它功能属性 功能层次 检查功能 使用Requires ...
- 老周的ABP框架系列教程 -》 一、框架理论初步学习
老周的ABP框架系列教程 -- 一.框架理论初步学习 1. ABP框架的来源与作用简介 1.1 简介 1.1.1 ABP框架全称为"ASP.NET Boilerplate ...
- ABP框架个人开发实战(1)_环境搭建
前言 之前关注ABP框架有一阵子了,一直没有潜下心来实际研究一下.最近想自己建站,以后有自己的功能开发项目,可以在自己的站点上开发,并一步步的完善,所以找个比较好用的框架迫在眉睫,选来选去,决定用AB ...
- 后台工作者HangFire与ABP框架Abp.Hangfire及扩展
HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于大家来说,比较方便. HangFire是什么 Hangfire是一个开源框架(.NET ...
- ABP框架 - N层架构
目录 介绍 DDD分层 ABP架构模型 客户端 展现层 分布式服务层 应用层 领域层 基础设施层 介绍 在应用程序设计中,分层架构是一种被广泛使用的技术,它助于降低复杂度和提高代码的可重用性.在ABP ...
- 【ABP框架系列学习】介绍篇(1)
0.引言 该系列博文主要在[官方文档]及[tkbSimplest]ABP框架理论研究系列博文的基础上进行总结的,或许大家会质问,别人都已经翻译过了,这不是多此一举吗?原因如下: 1.[tkbSim ...
- ABP框架系列之三十四:(Multi-Tenancy-多租户)
What Is Multi Tenancy? "Software Multitenancy refers to a software architecture in which a sing ...
- ABP框架系列之十一:(AspNet-Core-ASPNET核心)
Introduction This document describes ASP.NET Core integration for ASP.NET Boilerplate framework. ASP ...
- ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十四节--后台工作者HangFire与ABP框架Abp.Hangfire及扩展
返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于 ...
随机推荐
- js-静态、原型、实例属性
本篇来说一下js中的属性: 1.静态属性 2.原型属性 3.实例属性 静态属性: function klass(){} var obj=new klass(); klass.count=0; klas ...
- Visual Studio 2010的MSDN帮助文档离线使用
如果没有在安装vs过程中安装帮助,也可通过Visual Studio帮助菜单中的Manage Help Settings来对帮助进行设置或安装. 可以选择从磁盘安装内容,如果选择从磁盘安装可能会要求提 ...
- 【探索】无形验证码 —— PoW 算力验证
先来思考一个问题:如何写一个能消耗对方时间的程序? 消耗时间还不简单,休眠一下就可以了: Sleep(1000) 这确实消耗了时间,但并没有消耗 CPU.如果对方开了变速齿轮,这瞬间就能完成. 不过要 ...
- 操作系统篇-hello world(免系统运行程序)
|| 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言 今天起开始分享关于操作系统的相关知识,本人也是菜鸟一个,正处于学习阶段,这整个操作系统篇也是我边学习边总结的一些结果,希 ...
- 来吧,HTML5之基础标签(上)
什么是html5 HTML 5 是下一代的 HTML.HTML5 仍处于完善之中.然而,大部分现代浏览器已经具备了某些 HTML5 支持. 学习过程中标签的理解 <a>标签 定义超链接, ...
- bzoj3208--记忆化搜索
题目大意: 花花山峰峦起伏,峰顶常年被雪,Memphis打算帮花花山风景区的人员开发一个滑雪项目. 我们可以把风景区看作一个n*n的地图,每个点有它的初始高度,滑雪只能从高处往低处滑[严格大于] ...
- GJM : C#设计模式汇总整理——导航 【原创】
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- Mysql - 数据库操作
之前介绍了数据库的增删改查, 发现忘记了数据库的一些基本操作, 比如建库, 建表, 改表等等. 那这里就来小结一下数据库sql形式的基本操作. 一.库操作 1. 建库 在建库之前, 可能需要看一下, ...
- (转载) Linux IO模式及 select、poll、epoll详解
注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...
- Linux设备管理(一)_kobject, kset,ktype分析
Linux内核大量使用面向对象的设计思想,通过追踪源码,我们甚至可以使用面向对象语言常用的UML类图来分析Linux设备管理的"类"之间的关系.这里以4.8.5内核为例从kobje ...