Browse Source

Always disabling tracking for `PermissionGrantRepository` queries.

pull/22214/head
maliming 2 years ago
parent
commit
41fa6ce9c7
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 16
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeeder.cs
  2. 85
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs

16
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeeder.cs

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Guids; using Volo.Abp.Guids;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
@ -33,14 +34,17 @@ public class PermissionDataSeeder : IPermissionDataSeeder, ITransientDependency
{ {
using (CurrentTenant.Change(tenantId)) using (CurrentTenant.Change(tenantId))
{ {
var names = grantedPermissions.ToArray(); using (PermissionGrantRepository.DisableTracking())
var existsPermissionGrants = (await PermissionGrantRepository.GetListAsync(names, providerName, providerKey)).Select(x => x.Name).ToList();
var permissions = names.Except(existsPermissionGrants).Select(permissionName => new PermissionGrant(GuidGenerator.Create(), permissionName, providerName, providerKey, tenantId)).ToList();
if (!permissions.Any())
{ {
return; var names = grantedPermissions.ToArray();
var existsPermissionGrants = (await PermissionGrantRepository.GetListAsync(names, providerName, providerKey)).Select(x => x.Name).ToList();
var permissions = names.Except(existsPermissionGrants).Select(permissionName => new PermissionGrant(GuidGenerator.Create(), permissionName, providerName, providerKey, tenantId)).ToList();
if (!permissions.Any())
{
return;
}
await PermissionGrantRepository.InsertManyAsync(permissions);
} }
await PermissionGrantRepository.InsertManyAsync(permissions);
} }
} }
} }

85
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs

@ -6,6 +6,7 @@ using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Caching; using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
namespace Volo.Abp.PermissionManagement; namespace Volo.Abp.PermissionManagement;
@ -67,36 +68,39 @@ public class PermissionStore : IPermissionStore, ITransientDependency
string currentName, string currentName,
PermissionGrantCacheItem currentCacheItem) PermissionGrantCacheItem currentCacheItem)
{ {
var permissions = await PermissionDefinitionManager.GetPermissionsAsync(); using (PermissionGrantRepository.DisableTracking())
{
var permissions = await PermissionDefinitionManager.GetPermissionsAsync();
Logger.LogDebug($"Getting all granted permissions from the repository for this provider name,key: {providerName},{providerKey}"); Logger.LogDebug($"Getting all granted permissions from the repository for this provider name,key: {providerName},{providerKey}");
var grantedPermissionsHashSet = new HashSet<string>( var grantedPermissionsHashSet = new HashSet<string>(
(await PermissionGrantRepository.GetListAsync(providerName, providerKey)).Select(p => p.Name) (await PermissionGrantRepository.GetListAsync(providerName, providerKey)).Select(p => p.Name)
); );
Logger.LogDebug($"Setting the cache items. Count: {permissions.Count}"); Logger.LogDebug($"Setting the cache items. Count: {permissions.Count}");
var cacheItems = new List<KeyValuePair<string, PermissionGrantCacheItem>>(); var cacheItems = new List<KeyValuePair<string, PermissionGrantCacheItem>>();
foreach (var permission in permissions) foreach (var permission in permissions)
{ {
var isGranted = grantedPermissionsHashSet.Contains(permission.Name); var isGranted = grantedPermissionsHashSet.Contains(permission.Name);
cacheItems.Add(new KeyValuePair<string, PermissionGrantCacheItem>( cacheItems.Add(new KeyValuePair<string, PermissionGrantCacheItem>(
CalculateCacheKey(permission.Name, providerName, providerKey), CalculateCacheKey(permission.Name, providerName, providerKey),
new PermissionGrantCacheItem(isGranted)) new PermissionGrantCacheItem(isGranted))
); );
if (permission.Name == currentName) if (permission.Name == currentName)
{ {
currentCacheItem.IsGranted = isGranted; currentCacheItem.IsGranted = isGranted;
}
} }
}
await Cache.SetManyAsync(cacheItems); await Cache.SetManyAsync(cacheItems);
Logger.LogDebug($"Finished setting the cache items. Count: {permissions.Count}"); Logger.LogDebug($"Finished setting the cache items. Count: {permissions.Count}");
}
} }
public virtual async Task<MultiplePermissionGrantResult> IsGrantedAsync(string[] names, string providerName, string providerKey) public virtual async Task<MultiplePermissionGrantResult> IsGrantedAsync(string[] names, string providerName, string providerKey)
@ -169,34 +173,37 @@ public class PermissionStore : IPermissionStore, ITransientDependency
string providerKey, string providerKey,
List<string> notCacheKeys) List<string> notCacheKeys)
{ {
var permissions = (await PermissionDefinitionManager.GetPermissionsAsync()) using (PermissionGrantRepository.DisableTracking())
.Where(x => notCacheKeys.Any(k => GetPermissionNameFormCacheKeyOrNull(k) == x.Name)).ToList(); {
var permissions = (await PermissionDefinitionManager.GetPermissionsAsync())
.Where(x => notCacheKeys.Any(k => GetPermissionNameFormCacheKeyOrNull(k) == x.Name)).ToList();
Logger.LogDebug($"Getting not cache granted permissions from the repository for this provider name,key: {providerName},{providerKey}"); Logger.LogDebug($"Getting not cache granted permissions from the repository for this provider name,key: {providerName},{providerKey}");
var grantedPermissionsHashSet = new HashSet<string>( var grantedPermissionsHashSet = new HashSet<string>(
(await PermissionGrantRepository.GetListAsync(notCacheKeys.Select(GetPermissionNameFormCacheKeyOrNull).ToArray(), providerName, providerKey)).Select(p => p.Name) (await PermissionGrantRepository.GetListAsync(notCacheKeys.Select(GetPermissionNameFormCacheKeyOrNull).ToArray(), providerName, providerKey)).Select(p => p.Name)
); );
Logger.LogDebug($"Setting the cache items. Count: {permissions.Count}"); Logger.LogDebug($"Setting the cache items. Count: {permissions.Count}");
var cacheItems = new List<KeyValuePair<string, PermissionGrantCacheItem>>(); var cacheItems = new List<KeyValuePair<string, PermissionGrantCacheItem>>();
foreach (var permission in permissions) foreach (var permission in permissions)
{ {
var isGranted = grantedPermissionsHashSet.Contains(permission.Name); var isGranted = grantedPermissionsHashSet.Contains(permission.Name);
cacheItems.Add(new KeyValuePair<string, PermissionGrantCacheItem>( cacheItems.Add(new KeyValuePair<string, PermissionGrantCacheItem>(
CalculateCacheKey(permission.Name, providerName, providerKey), CalculateCacheKey(permission.Name, providerName, providerKey),
new PermissionGrantCacheItem(isGranted)) new PermissionGrantCacheItem(isGranted))
); );
} }
await Cache.SetManyAsync(cacheItems); await Cache.SetManyAsync(cacheItems);
Logger.LogDebug($"Finished setting the cache items. Count: {permissions.Count}"); Logger.LogDebug($"Finished setting the cache items. Count: {permissions.Count}");
return cacheItems; return cacheItems;
}
} }
protected virtual string CalculateCacheKey(string name, string providerName, string providerKey) protected virtual string CalculateCacheKey(string name, string providerName, string providerKey)

Loading…
Cancel
Save