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

Loading…
Cancel
Save