完成API的添加后,如何对这些API进行授权处理呢?
权限配置
首先添加权限。
在xxxxx.Core Project的Authorization目录下,有个xxxxxAuthorizationProvider.cs类,在其SetPermissions方法内添加三个权限。
public override void SetPermissions(IPermissionDefinitionContext context)
{
context.CreatePermission(PermissionNames.Pages_Users, L("Users"));
context.CreatePermission(PermissionNames.Pages_Roles, L("Roles"));
context.CreatePermission(PermissionNames.Pages_Tenants, L("Tenants"), multiTenancySides: MultiTenancySides.Host);
// 添加三种权限
var fileInfoPer = context.CreatePermission("FileInfo", L("FileInfo"));
fileInfoPer.CreateChildPermission("FileInfo.Create", L("FileInfo.Create")); // FileInfo.Create 是FileInfo下的子权限
fileInfoPer.CreateChildPermission("FileInfo.Delete", L("FileInfo.Delete")); // FileInfo.Delete 是FileInfo下的子权限
}
接着,为功能添加权限拦截
[AbpAuthorize("FileInfo")]
public string GetTestString()
{
return "A";
}
[AbpAuthorize("FileInfo.Delete")]
public override Task Delete(EntityDto<long> input)
{
return base.Delete(input);
}
[AbpAuthorize("FileInfo.Create")]
public override async Task<FileInfoDto> Create(FileInfoDto input)
{
return await base.Create(input);
}
为样就完成了权限的配置了。
测试:
分别添加三个角色,
分别对应三个权限。
再添加三个用户,分别对应三个角色。
测试结果:
用户 | 功能 | 返回结果 |
---|---|---|
Create_User | Create | 200 |
Create_User | Delete | 403 |
Create_User | GetTestString | 403 |
Delete_User | Create | 403 |
Delete_User | Delete | 200 |
Delete_User | GetTestString | 403 |
FileInfoUser | Create | 403 |
FileInfoUser | Delete | 403 |
FileInfoUser | GetTestString | 200 |
令我感到困惑的是子权限,我之前以为子权限Default会继承父权限的权限,那么CreateUser和DeleteUser对GetTestString应该都是200的。
又或者父权限是所有子权限的合集,FileInfoUser对Create和Delete是200的。
但测试结果显示,这三个权限是独立的,那么,CreateChildPermission有什么用?直接三个权限都是CreatePermission好了,有必要CreateChildPermission?
这个问题需留待以后找答案。
使用AbpAuthorize特性需要注意的地方
ABP对于授权使用了强大的动态方法拦截(interception)。因此,使用AbpAuthorize特性有一些限制:
不能用于私有方法。
不能用于静态方法。
不能用于非注入类的方法(我们必须要使用依赖注入)。
此外,
可以用于任何 public方法,如果该方法是通过接口调用的(比如应用服务通过接口使用)。
方法应该是virtual的,如果它是从类的引用直接调用的(比如ASP.Net MVC或者Web API的控制器)。
如果方法是protected的,那么它应该是 virtual的。
注意:AbpAuthorize特性有三个: 在应用服务中(应用层),我们使用Abp.Authorization.AbpAuthorize类。
在MVC控制器中(Web层),我们使用 Abp.Web.Mvc.Authorization.AbpMvcAuthorize类。
在ASP.NET Web API中,我们使用 Abp.WebApi.Authorization.AbpApiAuthorize特性。
这写特性的差异来自继承。在MVC端,派生自MVC自己的Authorize类。在Web API端,它派生自Web
API的Authorize类。因此,它已经很好地集成到了MVC和Web API。但是在应用层,它完全是ABP自己的实现而没有扩展任何类。
那么,在私有方法,静态方法,非注入类的方法如果进行权限拦截?
用PermissionChecker.Authorize方法
public string GetTestString()
{
PermissionChecker.Authorize("FileInfo");
return "A";
}
public override Task Delete(EntityDto<long> input)
{
PermissionChecker.Authorize("FileInfo.Delete");
return base.Delete(input);
}
public override async Task<FileInfoDto> Create(FileInfoDto input)
{
PermissionChecker.Authorize("FileInfo.Create");
return await base.Create(input);
}
这样,效果是等同使用AbpAuthorize特性的。
下一节,什么是Features?和Permission有什么异同?