文章目錄
- 一、前言
- 二、權限如何使用
- 三、如何定義自己的權限:
- 四、如何給角色綁定初始化權限
- 五、總結
一、前言
上一張講解了AbpVnext自帶的使用者、角色、權限、及使用者角色授權對應的後端架構表結構,這章主要講講在AbpVnext中如何添加自定義權限條目事項;
二、權限如何使用
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Application.Services;
namespace AoRuiDe.GasMonitoring
{
[Authorize] //需要登入即可通路
public class ResourceAppService: ApplicationService, IResourceAppService
{
public Task<List<ResourceDto>> GetListAsync()
{
...
}
[AllowAnonymous] //無需登入 公開所有人皆可通路
public Task<ResourceDto> GetAsync(Guid id)
{
...
}
[Authorize("GasMonitoring.Logs.Create")] // 使用者需要先登入且具有GasMonitoring.Logs.Create 權限方可通路
public Task CreateAsync(CreateResourceDto input)
{
...
}
}
}
三、如何定義自己的權限:
- 找到應用層契約項目:xxx.Application.Contracts
- 找到預設的自定義權限類:xxxPermissionDefinitionProvider.cs
【Abp VNext】實戰入門(十二):【2】角色權限管理 —— 添加自定義權限條目一、前言二、權限如何使用三、如何定義自己的權限:四、如何給角色綁定初始化權限五、總結 - 自定義權限:定義好項目自動發現,在前端通過接口擷取權限時可以提取到,用于選擇授權;
using AoRuiDe.GasMonitoring.Localization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Localization;
namespace AoRuiDe.GasMonitoring.Permissions
{
public class GasMonitoringPermissionDefinitionProvider : PermissionDefinitionProvider
{
public override void Define(IPermissionDefinitionContext context)
{
var myGroup = context.AddGroup("GasMonitoring");//定義權限組
PermissionDefinition tmpLogManagement = myGroup.AddPermission("Logs");//定義一級權限(資料庫中并未單獨存放權限資料,隻有在給某個指定使用者或者角色授權後,相應的權限項目才會以歸屬的形式記錄到資料庫)
tmpLogManagement.AddChild("Logs.Create");//子權限
tmpLogManagement.AddChild("Logs.Update");//子權限
tmpLogManagement.AddChild("Logs.Delete");//子權限
tmpLogManagement.AddChild("Logs.Select");//子權限
}
private static LocalizableString L(string name)
{
return LocalizableString.Create<GasMonitoringResource>(name);
}
}
}
四、如何給角色綁定初始化權限
-
admin管理者權限:
所有自定義權限會在種子資料初始化的時候自動綁定到管理者admin角色下面,具體記錄在表 “abppermissiongrants”
- 建立預設角色:
using AoRuiDe.GasMonitoring.DeviceDomain.AreaCruises;
//********
namespace AoRuiDe.GasMonitoring.Data
{
public class DefaultDataSeederContributor : IDataSeedContributor, ITransientDependency
{
private readonly IRepository<IdentityRole> _identityRoles;
public DefaultDataSeederContributor(IRepository<IdentityRole> identityRoles)
{
_identityRoles = identityRoles;
}
public async Task SeedAsync(DataSeedContext context)
{
//4、初始化各種角色
await CreateRolesDataAsync();
}
/// <summary>
/// 初始化角色資料
/// </summary>
/// <returns></returns>
private async Task CreateRolesDataAsync()
{
List<IdentityRole> tmpIdentityRoleLst = new List<IdentityRole>()
{
new IdentityRole(Guid.NewGuid(),"Boss"),
new IdentityRole(Guid.NewGuid(),"Minister"),
new IdentityRole(Guid.NewGuid(),"Director"),
new IdentityRole(Guid.NewGuid(),"Operator"),
new IdentityRole(Guid.NewGuid(),"visitor")
};
foreach (var item in tmpIdentityRoleLst)
{
var tmpIdentityRole = await _identityRoles.FirstOrDefaultAsync(p => p.Name == item.Name);
if (tmpIdentityRole != null)
{
await _identityRoles.DeleteAsync(tmpIdentityRole);
}
await _identityRoles.InsertAsync(item);
}
}
}
}
- 給某個指定角色或者使用者綁定指定權限與上面操作類似
/// <summary>
/// 給管理者授予告警日志删除權限
/// </summary>
/// <returns></returns>
public async Task CreatePermissionGrantDataAsync()
{
List<PermissionGrant> permissionGrantLst = new List<PermissionGrant>()
{
new PermissionGrant(Guid.NewGuid(),"Warn","R","Boss"),//給Boss角色綁定初始權限
new PermissionGrant(Guid.NewGuid(),"Warn.Create","R","Boss"),
new PermissionGrant(Guid.NewGuid(),"Warn.Update","R","Boss"),
new PermissionGrant(Guid.NewGuid(),"Warn.Delete","R","Boss"),
new PermissionGrant(Guid.NewGuid(),"Warn.Select","R","Boss")
new PermissionGrant(Guid.NewGuid(),"Warn","R","userID"),//給某個指定使用者綁定權限
new PermissionGrant(Guid.NewGuid(),"Warn.Create","R","userID"),
};
foreach (var item in permissionGrantLst)
{
var tmpPermission = await _permissionGrants.FirstOrDefaultAsync(p => p.Name == item.Name && p.ProviderKey == item.ProviderKey);
if (tmpPermission != null)
{
await _permissionGrants.DeleteAsync(tmpPermission);
}
await _permissionGrants.InsertAsync(item);
}
}
五、總結
資料庫中并未單獨存放自定義權限資料,隻有在給某個指定使用者或者角色授權後,相應的權限條目才會以歸屬的形式記錄到資料庫;
使用者角色權限具體講解詳見上一章節;