天天看點

【Abp VNext】實戰入門(十二):【2】角色權限管理 —— 添加自定義權限條目一、前言二、權限如何使用三、如何定義自己的權限:四、如何給角色綁定初始化權限五、總結

文章目錄

  • 一、前言
  • 二、權限如何使用
  • 三、如何定義自己的權限:
  • 四、如何給角色綁定初始化權限
  • 五、總結

一、前言

上一張講解了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)
        {
            ...
        }
    }
}

           

三、如何定義自己的權限:

  1. 找到應用層契約項目:xxx.Application.Contracts
  2. 找到預設的自定義權限類:xxxPermissionDefinitionProvider.cs
    【Abp VNext】實戰入門(十二):【2】角色權限管理 —— 添加自定義權限條目一、前言二、權限如何使用三、如何定義自己的權限:四、如何給角色綁定初始化權限五、總結
  3. 自定義權限:定義好項目自動發現,在前端通過接口擷取權限時可以提取到,用于選擇授權;
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);
        }
    }
}
           
【Abp VNext】實戰入門(十二):【2】角色權限管理 —— 添加自定義權限條目一、前言二、權限如何使用三、如何定義自己的權限:四、如何給角色綁定初始化權限五、總結

四、如何給角色綁定初始化權限

  1. admin管理者權限:

    所有自定義權限會在種子資料初始化的時候自動綁定到管理者admin角色下面,具體記錄在表 “abppermissiongrants”

  2. 建立預設角色:
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);
            }
        }
   }
}
           
  1. 給某個指定角色或者使用者綁定指定權限與上面操作類似
/// <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);
            }
        }
           

五、總結

資料庫中并未單獨存放自定義權限資料,隻有在給某個指定使用者或者角色授權後,相應的權限條目才會以歸屬的形式記錄到資料庫;

使用者角色權限具體講解詳見上一章節;

繼續閱讀