|
|
|
|
@ -1,4 +1,5 @@
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
using Microsoft.Extensions.Logging.Abstractions;
|
|
|
|
|
using Volo.Abp.Authorization.Permissions;
|
|
|
|
|
@ -10,17 +11,21 @@ namespace Volo.Abp.PermissionManagement
|
|
|
|
|
public class PermissionStore : IPermissionStore, ITransientDependency
|
|
|
|
|
{
|
|
|
|
|
public ILogger<PermissionStore> Logger { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected IPermissionGrantRepository PermissionGrantRepository { get; }
|
|
|
|
|
|
|
|
|
|
protected IPermissionDefinitionManager PermissionDefinitionManager { get; }
|
|
|
|
|
|
|
|
|
|
protected IDistributedCache<PermissionGrantCacheItem> Cache { get; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public PermissionStore(
|
|
|
|
|
IPermissionGrantRepository permissionGrantRepository,
|
|
|
|
|
IDistributedCache<PermissionGrantCacheItem> cache)
|
|
|
|
|
IDistributedCache<PermissionGrantCacheItem> cache,
|
|
|
|
|
IPermissionDefinitionManager permissionDefinitionManager)
|
|
|
|
|
{
|
|
|
|
|
PermissionGrantRepository = permissionGrantRepository;
|
|
|
|
|
Cache = cache;
|
|
|
|
|
PermissionDefinitionManager = permissionDefinitionManager;
|
|
|
|
|
Logger = NullLogger<PermissionStore>.Instance;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -29,7 +34,10 @@ namespace Volo.Abp.PermissionManagement
|
|
|
|
|
return (await GetCacheItemAsync(name, providerName, providerKey)).IsGranted;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual async Task<PermissionGrantCacheItem> GetCacheItemAsync(string name, string providerName, string providerKey)
|
|
|
|
|
protected virtual async Task<PermissionGrantCacheItem> GetCacheItemAsync(
|
|
|
|
|
string name,
|
|
|
|
|
string providerName,
|
|
|
|
|
string providerKey)
|
|
|
|
|
{
|
|
|
|
|
var cacheKey = CalculateCacheKey(name, providerName, providerKey);
|
|
|
|
|
|
|
|
|
|
@ -43,23 +51,45 @@ namespace Volo.Abp.PermissionManagement
|
|
|
|
|
return cacheItem;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Logger.LogDebug($"Not found in the cache, getting from the repository: {cacheKey}");
|
|
|
|
|
Logger.LogDebug($"Not found in the cache: {cacheKey}");
|
|
|
|
|
|
|
|
|
|
cacheItem = new PermissionGrantCacheItem(name, false);
|
|
|
|
|
|
|
|
|
|
await SetCacheItemsAsync(providerName, providerKey, name, cacheItem);
|
|
|
|
|
|
|
|
|
|
cacheItem = new PermissionGrantCacheItem(
|
|
|
|
|
name,
|
|
|
|
|
(await PermissionGrantRepository.FindAsync(name, providerName, providerKey)) != null
|
|
|
|
|
);
|
|
|
|
|
return cacheItem;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Logger.LogDebug($"Setting the cache item: {cacheKey}");
|
|
|
|
|
protected virtual async Task SetCacheItemsAsync(
|
|
|
|
|
string providerName,
|
|
|
|
|
string providerKey,
|
|
|
|
|
string currentName,
|
|
|
|
|
PermissionGrantCacheItem currentCacheItem)
|
|
|
|
|
{
|
|
|
|
|
var permissions = PermissionDefinitionManager.GetPermissions();
|
|
|
|
|
|
|
|
|
|
Logger.LogDebug($"Getting all granted permissions from the repository for this provider name,key: {providerName},{providerKey}");
|
|
|
|
|
|
|
|
|
|
await Cache.SetAsync(
|
|
|
|
|
cacheKey,
|
|
|
|
|
cacheItem
|
|
|
|
|
);
|
|
|
|
|
var permissionGrants = await PermissionGrantRepository.GetListAsync(providerName, providerKey);
|
|
|
|
|
|
|
|
|
|
Logger.LogDebug($"Finished setting the cache item: {cacheKey}");
|
|
|
|
|
Logger.LogDebug($"Setting the cache items. Count: {permissions.Count}");
|
|
|
|
|
|
|
|
|
|
return cacheItem;
|
|
|
|
|
foreach (var permission in permissions)
|
|
|
|
|
{
|
|
|
|
|
var isGranted = permissionGrants.Any(pg => pg.Name == permission.Name); //TODO: Optimize? Dictionary/Hash
|
|
|
|
|
|
|
|
|
|
await Cache.SetAsync(
|
|
|
|
|
CalculateCacheKey(permission.Name, providerName, providerKey),
|
|
|
|
|
new PermissionGrantCacheItem(permission.Name, isGranted)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (permission.Name == currentName)
|
|
|
|
|
{
|
|
|
|
|
currentCacheItem.IsGranted = isGranted;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Logger.LogDebug($"Finished setting the cache items. Count: {permissions.Count}");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual string CalculateCacheKey(string name, string providerName, string providerKey)
|
|
|
|
|
@ -67,4 +97,4 @@ namespace Volo.Abp.PermissionManagement
|
|
|
|
|
return PermissionGrantCacheItem.CalculateCacheKey(name, providerName, providerKey);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|