ABP官方文档翻译 4.4 授权
授权
介绍
几乎所有的企业应用都在一定程度上使用授权。在应用中,授权用来检查用户是否允许执行一些特定的操作。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 授权的更多相关文章
- ABP官方文档翻译 4.5 特征管理
特征管理 介绍 关于IFeatureValueStore 特征类型 Boolean特征 Value特征 定义特征 基本特征属性 其他特征属性 特征层级 检查特征 使用RequiresFeature特性 ...
- 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 ...
- ABP官方文档翻译 7.2 Hangfire集成
Hangfire集成 介绍 ASP.NET Core集成 ASP.NET MVC 5.x集成 面板授权 介绍 Hangfire是一个综合的后台job管理器.你可以 把它集成到ABP,用来取代默认的后台 ...
- ABP官方文档翻译 6.7 CSRF/XSRF保护
CSRF/XSRF保护 介绍 HTTP动词 非浏览器客户端 ASP.NET MVC 特征 集成 布局视图 配置 ASP.NET Web API 特征 集成 集成到ASP.NET MVC客户端 集成到其 ...
- ABP官方文档翻译 6.4 导航
导航 创建菜单 注册导航提供者 显示菜单 每一个网络应用都会有一些菜单用来在pages/screens之间导航.ABP提供了通用的基础设施来创建并显示菜单. 创建菜单 应用可以由不同的模块组成,每一个 ...
- ABP官方文档翻译 6.2.1 ASP.NET Core集成
ASP.NET Core 介绍 迁移到ASP.NET Core? 启动模板 配置 启动类 模块配置 控制器 应用服务作为控制器 过滤器 授权过滤器 审计Action过滤器 校验过滤器 工作单元Acti ...
- ABP官方文档翻译 6.1.2 MVC视图
ASP.NET MVC 视图 介绍 AbpWebViewPage基类 介绍 ABP通过Abp.Web.Mvc nuget包集成到MVC视图.你可以如往常一样创建正常的MVC视图. AbpWebView ...
- ABP官方文档翻译 6.1.1 MVC控制器
ASP.NET MVC控制器 介绍 AbpController基类 本地化 其他 过滤器 异常处理和结果包装 审计日志 验证 授权 工作单元 介绍 ABP通过Abp.Web.Mvc nuget包集成到 ...
- ABP官方文档翻译 5.1 Web API控制器
ASP.NET Web API控制器 介绍 AbpApiController基类 本地化 其他 过滤器 审计日志 授权 反伪造过滤器 工作单元 结果包装和异常处理 结果缓存 校验 模型绑定器 介绍 A ...
随机推荐
- Vijos P1103 校门外的树【线段树,模拟】
校门外的树 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……, ...
- ubantu下su命令Authentication failure失败的解决方式
Ubuntu安装后,root用户默认是被锁定了的,不允许登录,也不允许 su 到 root . 可以使用: sudo passwd 来重新设置root密码,后即可登陆root. ortonwu@ubu ...
- Result Maps collection does not contain value for com.man.impet.dao.OrderBeanMapper.map
由于mapper.xml中resultMap = "map" 改为 resultType="map"即可,折腾了一下午
- [国嵌攻略][108][Linux内核链表]
链表简介 链表是一种常见的数据结构,它通过指针将一系列数据节点连接成一条数据链.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入 ...
- ubuntu 下 apt /apt-get command not found 命令找不到
简介:apt 命令在ubuntu下找不到.(针对云平台,等可联网的ubuntu 如果是虚拟机,请确认能否联网 (如是虚拟机且不能联网请参考其他文章,大致方向是先挂载系统镜像再安装)) (ps:一般的 ...
- NYOJ 1249 物资调度(DFS+剪枝)
题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=1249 描述 某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷.衣物.食品和血浆等物 ...
- java包装类简析
对于8个基本类型,java提供了他们相应的包装类: 基本类型 包装类 byte java.lang.Byte short java.lang.Short int java.lang.Integer l ...
- dedecms标签大全
今天用了1个小时的时间整理了dedecms标签大全,非常经典,非常经典的织梦dedecms标签,希望对大家制作dedecms网站有帮助 channel_____栏目 dede_arcty ...
- IT项目角色标准定义
角色 角色标准定义 项目主管 负责协助项目经理分配资源,确定优先级,协调公司和项目组之间的沟通.保证项目团队一直处于良好的状态中.同时监督项目经理的工作方法,以确保项目以及工件符合公司的发展方向以及用 ...
- 一句话 Servlet
Servlet是用来完成B/S架构下,客户端请求的响应处理. web.xml其实就是servlet的一个配置文件,通过他来寻找对应的servlet