Browse Source

Merge pull request #20767 from abpframework/DynamicPermissionDefinitionChangedEto

Publish an event when dynamic permissions change.
pull/20792/head
Halil İbrahim Kalkan 2 years ago
committed by GitHub
parent
commit
55fe6718d8
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 12
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionsChangedEto.cs
  2. 29
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs

12
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<string> Permissions { get; set; }
}

29
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.Caching;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.DistributedLocking; using Volo.Abp.DistributedLocking;
using Volo.Abp.EventBus.Distributed;
using Volo.Abp.Json.SystemTextJson.Modifiers; using Volo.Abp.Json.SystemTextJson.Modifiers;
using Volo.Abp.Threading; using Volo.Abp.Threading;
using Volo.Abp.Uow; using Volo.Abp.Uow;
@ -29,8 +30,8 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
protected AbpPermissionOptions PermissionOptions { get; } protected AbpPermissionOptions PermissionOptions { get; }
protected ICancellationTokenProvider CancellationTokenProvider { get; } protected ICancellationTokenProvider CancellationTokenProvider { get; }
protected AbpDistributedCacheOptions CacheOptions { get; } protected AbpDistributedCacheOptions CacheOptions { get; }
protected IUnitOfWorkManager UnitOfWorkManager { get; } protected IUnitOfWorkManager UnitOfWorkManager { get; }
protected IDistributedEventBus DistributedEventBus { get; }
public StaticPermissionSaver( public StaticPermissionSaver(
IStaticPermissionDefinitionStore staticStore, IStaticPermissionDefinitionStore staticStore,
@ -43,9 +44,11 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
IAbpDistributedLock distributedLock, IAbpDistributedLock distributedLock,
IOptions<AbpPermissionOptions> permissionOptions, IOptions<AbpPermissionOptions> permissionOptions,
ICancellationTokenProvider cancellationTokenProvider, ICancellationTokenProvider cancellationTokenProvider,
IUnitOfWorkManager unitOfWorkManager) IUnitOfWorkManager unitOfWorkManager,
IDistributedEventBus distributedEventBus)
{ {
UnitOfWorkManager = unitOfWorkManager; UnitOfWorkManager = unitOfWorkManager;
DistributedEventBus = distributedEventBus;
StaticStore = staticStore; StaticStore = staticStore;
PermissionGroupRepository = permissionGroupRepository; PermissionGroupRepository = permissionGroupRepository;
PermissionRepository = permissionRepository; PermissionRepository = permissionRepository;
@ -104,12 +107,13 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
throw new AbpException("Could not acquire distributed lock for saving static permissions!"); throw new AbpException("Could not acquire distributed lock for saving static permissions!");
} }
var newOrChangedPermissions = new List<string>();
using (var unitOfWork = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true)) using (var unitOfWork = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true))
{ {
try try
{ {
var hasChangesInGroups = await UpdateChangedPermissionGroupsAsync(permissionGroupRecords); var hasChangesInGroups = await UpdateChangedPermissionGroupsAsync(permissionGroupRecords);
var hasChangesInPermissions = await UpdateChangedPermissionsAsync(permissionRecords); var hasChangesInPermissions = await UpdateChangedPermissionsAsync(permissionRecords, newOrChangedPermissions);
if (hasChangesInGroups || hasChangesInPermissions) if (hasChangesInGroups || hasChangesInPermissions)
{ {
@ -133,12 +137,20 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
{ {
/* ignored */ /* ignored */
} }
throw; throw;
} }
await unitOfWork.CompleteAsync(); await unitOfWork.CompleteAsync();
} }
if (newOrChangedPermissions.Any())
{
await DistributedEventBus.PublishAsync(new DynamicPermissionDefinitionsChangedEto
{
Permissions = newOrChangedPermissions.Distinct().ToList()
});
}
} }
await Cache.SetStringAsync( await Cache.SetStringAsync(
@ -207,8 +219,7 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
return newRecords.Any() || changedRecords.Any() || deletedRecords.Any(); return newRecords.Any() || changedRecords.Any() || deletedRecords.Any();
} }
private async Task<bool> UpdateChangedPermissionsAsync( private async Task<bool> UpdateChangedPermissionsAsync(IEnumerable<PermissionDefinitionRecord> permissionRecords, List<string> newOrChangedPermissions)
IEnumerable<PermissionDefinitionRecord> permissionRecords)
{ {
var newRecords = new List<PermissionDefinitionRecord>(); var newRecords = new List<PermissionDefinitionRecord>();
var changedRecords = new List<PermissionDefinitionRecord>(); var changedRecords = new List<PermissionDefinitionRecord>();
@ -221,7 +232,7 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
var permissionRecordInDatabase = permissionRecordsInDatabase.GetOrDefault(permissionRecord.Name); var permissionRecordInDatabase = permissionRecordsInDatabase.GetOrDefault(permissionRecord.Name);
if (permissionRecordInDatabase == null) if (permissionRecordInDatabase == null)
{ {
/* New group */ /* New permission */
newRecords.Add(permissionRecord); newRecords.Add(permissionRecord);
continue; continue;
} }
@ -258,11 +269,13 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
if (newRecords.Any()) if (newRecords.Any())
{ {
newOrChangedPermissions.AddRange(newRecords.Select(x => x.Name));
await PermissionRepository.InsertManyAsync(newRecords); await PermissionRepository.InsertManyAsync(newRecords);
} }
if (changedRecords.Any()) if (changedRecords.Any())
{ {
newOrChangedPermissions.AddRange(newRecords.Select(x => x.Name));
await PermissionRepository.UpdateManyAsync(changedRecords); await PermissionRepository.UpdateManyAsync(changedRecords);
} }
@ -330,4 +343,4 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
.ToString() .ToString()
.ToMd5(); .ToMd5();
} }
} }

Loading…
Cancel
Save