From 5b04fc4022e436b3b7d985051cab198164040fb7 Mon Sep 17 00:00:00 2001 From: maliming Date: Sun, 8 Sep 2024 15:44:08 +0800 Subject: [PATCH] Publish an event when dynamic permissions change. --- .../DynamicPermissionDefinitionsChangedEto.cs | 12 ++++++++ .../StaticPermissionSaver.cs | 29 ++++++++++++++----- 2 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionsChangedEto.cs diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionsChangedEto.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionsChangedEto.cs new file mode 100644 index 0000000000..f1e27aad1e --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionsChangedEto.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.EventBus; + +namespace Volo.Abp.PermissionManagement; + +[Serializable] +[EventName("abp.permission-management.dynamic-permission-definitions-changed")] +public class DynamicPermissionDefinitionsChangedEto +{ + public List Permissions { get; set; } +} diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs index 1ef851dac3..4fe6e63e3f 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs @@ -11,6 +11,7 @@ using Volo.Abp.Authorization.Permissions; using Volo.Abp.Caching; using Volo.Abp.DependencyInjection; using Volo.Abp.DistributedLocking; +using Volo.Abp.EventBus.Distributed; using Volo.Abp.Json.SystemTextJson.Modifiers; using Volo.Abp.Threading; using Volo.Abp.Uow; @@ -29,8 +30,8 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc protected AbpPermissionOptions PermissionOptions { get; } protected ICancellationTokenProvider CancellationTokenProvider { get; } protected AbpDistributedCacheOptions CacheOptions { get; } - protected IUnitOfWorkManager UnitOfWorkManager { get; } + protected IDistributedEventBus DistributedEventBus { get; } public StaticPermissionSaver( IStaticPermissionDefinitionStore staticStore, @@ -43,9 +44,11 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc IAbpDistributedLock distributedLock, IOptions permissionOptions, ICancellationTokenProvider cancellationTokenProvider, - IUnitOfWorkManager unitOfWorkManager) + IUnitOfWorkManager unitOfWorkManager, + IDistributedEventBus distributedEventBus) { UnitOfWorkManager = unitOfWorkManager; + DistributedEventBus = distributedEventBus; StaticStore = staticStore; PermissionGroupRepository = permissionGroupRepository; PermissionRepository = permissionRepository; @@ -104,12 +107,13 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc throw new AbpException("Could not acquire distributed lock for saving static permissions!"); } + var newOrChangedPermissions = new List(); using (var unitOfWork = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true)) { try { var hasChangesInGroups = await UpdateChangedPermissionGroupsAsync(permissionGroupRecords); - var hasChangesInPermissions = await UpdateChangedPermissionsAsync(permissionRecords); + var hasChangesInPermissions = await UpdateChangedPermissionsAsync(permissionRecords, newOrChangedPermissions); if (hasChangesInGroups || hasChangesInPermissions) { @@ -133,12 +137,20 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc { /* ignored */ } - + throw; } await unitOfWork.CompleteAsync(); } + + if (newOrChangedPermissions.Any()) + { + await DistributedEventBus.PublishAsync(new DynamicPermissionDefinitionsChangedEto + { + Permissions = newOrChangedPermissions.Distinct().ToList() + }); + } } await Cache.SetStringAsync( @@ -207,8 +219,7 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc return newRecords.Any() || changedRecords.Any() || deletedRecords.Any(); } - private async Task UpdateChangedPermissionsAsync( - IEnumerable permissionRecords) + private async Task UpdateChangedPermissionsAsync(IEnumerable permissionRecords, List newOrChangedPermissions) { var newRecords = new List(); var changedRecords = new List(); @@ -221,7 +232,7 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc var permissionRecordInDatabase = permissionRecordsInDatabase.GetOrDefault(permissionRecord.Name); if (permissionRecordInDatabase == null) { - /* New group */ + /* New permission */ newRecords.Add(permissionRecord); continue; } @@ -258,11 +269,13 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc if (newRecords.Any()) { + newOrChangedPermissions.AddRange(newRecords.Select(x => x.Name)); await PermissionRepository.InsertManyAsync(newRecords); } if (changedRecords.Any()) { + newOrChangedPermissions.AddRange(newRecords.Select(x => x.Name)); await PermissionRepository.UpdateManyAsync(changedRecords); } @@ -330,4 +343,4 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc .ToString() .ToMd5(); } -} \ No newline at end of file +}