ABP学习 之 权限配置

完成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_UserCreate200
Create_UserDelete403
Create_UserGetTestString403
Delete_UserCreate403
Delete_UserDelete200
Delete_UserGetTestString403
FileInfoUserCreate403
FileInfoUserDelete403
FileInfoUserGetTestString200

令我感到困惑的是子权限,我之前以为子权限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有什么异同?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值