Browse Source

Move `DeletedPermissions` and `DeletedPermissionGroups` to `AbpPermissionOptions`.

pull/13881/head
maliming 4 years ago
parent
commit
05ba7b40ac
  1. 10
      framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/AbpPermissionOptions.cs
  2. 9
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementOptions.cs
  3. 60
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs

10
framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/AbpPermissionOptions.cs

@ -1,4 +1,5 @@
using Volo.Abp.Collections; using System.Collections.Generic;
using Volo.Abp.Collections;
namespace Volo.Abp.Authorization.Permissions; namespace Volo.Abp.Authorization.Permissions;
@ -8,9 +9,16 @@ public class AbpPermissionOptions
public ITypeList<IPermissionValueProvider> ValueProviders { get; } public ITypeList<IPermissionValueProvider> ValueProviders { get; }
public HashSet<string> DeletedPermissions { get; }
public HashSet<string> DeletedPermissionGroups { get; }
public AbpPermissionOptions() public AbpPermissionOptions()
{ {
DefinitionProviders = new TypeList<IPermissionDefinitionProvider>(); DefinitionProviders = new TypeList<IPermissionDefinitionProvider>();
ValueProviders = new TypeList<IPermissionValueProvider>(); ValueProviders = new TypeList<IPermissionValueProvider>();
DeletedPermissions = new HashSet<string>();
DeletedPermissionGroups = new HashSet<string>();
} }
} }

9
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementOptions.cs

@ -8,11 +8,7 @@ public class PermissionManagementOptions
public ITypeList<IPermissionManagementProvider> ManagementProviders { get; } public ITypeList<IPermissionManagementProvider> ManagementProviders { get; }
public Dictionary<string, string> ProviderPolicies { get; } public Dictionary<string, string> ProviderPolicies { get; }
public HashSet<string> DeletedPermissions { get; }
public HashSet<string> DeletedPermissionGroups { get; }
/// <summary> /// <summary>
/// Default: true. /// Default: true.
/// </summary> /// </summary>
@ -27,8 +23,5 @@ public class PermissionManagementOptions
{ {
ManagementProviders = new TypeList<IPermissionManagementProvider>(); ManagementProviders = new TypeList<IPermissionManagementProvider>();
ProviderPolicies = new Dictionary<string, string>(); ProviderPolicies = new Dictionary<string, string>();
DeletedPermissions = new HashSet<string>();
DeletedPermissionGroups = new HashSet<string>();
} }
} }

60
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs

@ -24,20 +24,20 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
protected IDistributedCache Cache { get; } protected IDistributedCache Cache { get; }
protected IApplicationNameAccessor ApplicationNameAccessor { get; } protected IApplicationNameAccessor ApplicationNameAccessor { get; }
protected IAbpDistributedLock DistributedLock { get; } protected IAbpDistributedLock DistributedLock { get; }
protected PermissionManagementOptions PermissionManagementOptions { get; } protected AbpPermissionOptions PermissionOptions { get; }
protected ICancellationTokenProvider CancellationTokenProvider { get; } protected ICancellationTokenProvider CancellationTokenProvider { get; }
protected AbpDistributedCacheOptions CacheOptions { get; } protected AbpDistributedCacheOptions CacheOptions { get; }
public StaticPermissionSaver( public StaticPermissionSaver(
IStaticPermissionDefinitionStore staticStore, IStaticPermissionDefinitionStore staticStore,
IPermissionGroupDefinitionRecordRepository permissionGroupRepository, IPermissionGroupDefinitionRecordRepository permissionGroupRepository,
IPermissionDefinitionRecordRepository permissionRepository, IPermissionDefinitionRecordRepository permissionRepository,
IPermissionDefinitionSerializer permissionSerializer, IPermissionDefinitionSerializer permissionSerializer,
IDistributedCache cache, IDistributedCache cache,
IOptions<AbpDistributedCacheOptions> cacheOptions, IOptions<AbpDistributedCacheOptions> cacheOptions,
IApplicationNameAccessor applicationNameAccessor, IApplicationNameAccessor applicationNameAccessor,
IAbpDistributedLock distributedLock, IAbpDistributedLock distributedLock,
IOptions<PermissionManagementOptions> permissionManagementOptions, IOptions<AbpPermissionOptions> permissionOptions,
ICancellationTokenProvider cancellationTokenProvider) ICancellationTokenProvider cancellationTokenProvider)
{ {
StaticStore = staticStore; StaticStore = staticStore;
@ -48,23 +48,23 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
ApplicationNameAccessor = applicationNameAccessor; ApplicationNameAccessor = applicationNameAccessor;
DistributedLock = distributedLock; DistributedLock = distributedLock;
CancellationTokenProvider = cancellationTokenProvider; CancellationTokenProvider = cancellationTokenProvider;
PermissionManagementOptions = permissionManagementOptions.Value; PermissionOptions = permissionOptions.Value;
CacheOptions = cacheOptions.Value; CacheOptions = cacheOptions.Value;
} }
[UnitOfWork] [UnitOfWork]
public virtual async Task SaveAsync() public virtual async Task SaveAsync()
{ {
await using var applicationLockHandle = await DistributedLock.TryAcquireAsync( await using var applicationLockHandle = await DistributedLock.TryAcquireAsync(
GetApplicationDistributedLockKey() GetApplicationDistributedLockKey()
); );
if (applicationLockHandle == null) if (applicationLockHandle == null)
{ {
/* Another application instance is already doing it */ /* Another application instance is already doing it */
return; return;
} }
/* NOTE: This can be further optimized by using 4 cache values for: /* NOTE: This can be further optimized by using 4 cache values for:
* Groups, permissions, deleted groups and deleted permissions. * Groups, permissions, deleted groups and deleted permissions.
* But the code would be more complex. This is enough for now. * But the code would be more complex. This is enough for now.
@ -80,10 +80,10 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
var currentHash = CalculateHash( var currentHash = CalculateHash(
permissionGroupRecords, permissionGroupRecords,
permissionRecords, permissionRecords,
PermissionManagementOptions.DeletedPermissionGroups, PermissionOptions.DeletedPermissionGroups,
PermissionManagementOptions.DeletedPermissions PermissionOptions.DeletedPermissions
); );
if (cachedHash == currentHash) if (cachedHash == currentHash)
{ {
return; return;
@ -154,11 +154,11 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
permissionGroupRecordInDatabase.Patch(permissionGroupRecord); permissionGroupRecordInDatabase.Patch(permissionGroupRecord);
changedRecords.Add(permissionGroupRecordInDatabase); changedRecords.Add(permissionGroupRecordInDatabase);
} }
/* Deleted */ /* Deleted */
var deletedRecords = PermissionManagementOptions.DeletedPermissionGroups.Any() var deletedRecords = PermissionOptions.DeletedPermissionGroups.Any()
? permissionGroupRecordsInDatabase.Values ? permissionGroupRecordsInDatabase.Values
.Where(x => PermissionManagementOptions.DeletedPermissionGroups.Contains(x.Name)) .Where(x => PermissionOptions.DeletedPermissionGroups.Contains(x.Name))
.ToArray() .ToArray()
: Array.Empty<PermissionGroupDefinitionRecord>(); : Array.Empty<PermissionGroupDefinitionRecord>();
@ -176,10 +176,10 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
{ {
await PermissionGroupRepository.DeleteManyAsync(deletedRecords); await PermissionGroupRepository.DeleteManyAsync(deletedRecords);
} }
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) IEnumerable<PermissionDefinitionRecord> permissionRecords)
{ {
@ -209,23 +209,23 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
permissionRecordInDatabase.Patch(permissionRecord); permissionRecordInDatabase.Patch(permissionRecord);
changedRecords.Add(permissionRecordInDatabase); changedRecords.Add(permissionRecordInDatabase);
} }
/* Deleted */ /* Deleted */
var deletedRecords = new List<PermissionDefinitionRecord>(); var deletedRecords = new List<PermissionDefinitionRecord>();
if (PermissionManagementOptions.DeletedPermissions.Any()) if (PermissionOptions.DeletedPermissions.Any())
{ {
deletedRecords.AddRange( deletedRecords.AddRange(
permissionRecordsInDatabase.Values permissionRecordsInDatabase.Values
.Where(x => PermissionManagementOptions.DeletedPermissions.Contains(x.Name)) .Where(x => PermissionOptions.DeletedPermissions.Contains(x.Name))
); );
} }
if (PermissionManagementOptions.DeletedPermissionGroups.Any()) if (PermissionOptions.DeletedPermissionGroups.Any())
{ {
deletedRecords.AddIfNotContains( deletedRecords.AddIfNotContains(
permissionRecordsInDatabase.Values permissionRecordsInDatabase.Values
.Where(x => PermissionManagementOptions.DeletedPermissionGroups.Contains(x.GroupName)) .Where(x => PermissionOptions.DeletedPermissionGroups.Contains(x.GroupName))
); );
} }
@ -243,7 +243,7 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
{ {
await PermissionRepository.DeleteManyAsync(deletedRecords); await PermissionRepository.DeleteManyAsync(deletedRecords);
} }
return newRecords.Any() || changedRecords.Any() || deletedRecords.Any(); return newRecords.Any() || changedRecords.Any() || deletedRecords.Any();
} }
@ -261,7 +261,7 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
{ {
return $"{CacheOptions.KeyPrefix}_{ApplicationNameAccessor.ApplicationName}_AbpPermissionsHash"; return $"{CacheOptions.KeyPrefix}_{ApplicationNameAccessor.ApplicationName}_AbpPermissionsHash";
} }
private string GetCommonStampCacheKey() private string GetCommonStampCacheKey()
{ {
return $"{CacheOptions.KeyPrefix}_AbpInMemoryPermissionCacheStamp"; return $"{CacheOptions.KeyPrefix}_AbpInMemoryPermissionCacheStamp";
@ -274,21 +274,21 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
IEnumerable<string> deletedPermissions) IEnumerable<string> deletedPermissions)
{ {
var stringBuilder = new StringBuilder(); var stringBuilder = new StringBuilder();
stringBuilder.Append("PermissionGroupRecords:"); stringBuilder.Append("PermissionGroupRecords:");
stringBuilder.AppendLine(JsonSerializer.Serialize(permissionGroupRecords)); stringBuilder.AppendLine(JsonSerializer.Serialize(permissionGroupRecords));
stringBuilder.Append("PermissionRecords:"); stringBuilder.Append("PermissionRecords:");
stringBuilder.AppendLine(JsonSerializer.Serialize(permissionRecords)); stringBuilder.AppendLine(JsonSerializer.Serialize(permissionRecords));
stringBuilder.Append("DeletedPermissionGroups:"); stringBuilder.Append("DeletedPermissionGroups:");
stringBuilder.AppendLine(deletedPermissionGroups.JoinAsString(",")); stringBuilder.AppendLine(deletedPermissionGroups.JoinAsString(","));
stringBuilder.Append("DeletedPermission:"); stringBuilder.Append("DeletedPermission:");
stringBuilder.Append(deletedPermissions.JoinAsString(",")); stringBuilder.Append(deletedPermissions.JoinAsString(","));
return stringBuilder return stringBuilder
.ToString() .ToString()
.ToMd5(); .ToMd5();
} }
} }

Loading…
Cancel
Save