From e66f1d8b60a2067b1e285e1b9aa1e967e48714cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 21 Feb 2018 17:22:02 +0300 Subject: [PATCH] Use IDistributedCache inside of PermissionStore --- .../Volo/Abp/Permissions/PermissionStore.cs | 78 ++++++++----------- 1 file changed, 31 insertions(+), 47 deletions(-) diff --git a/src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionStore.cs b/src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionStore.cs index ab8bc997cc..d09ba8745e 100644 --- a/src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionStore.cs +++ b/src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionStore.cs @@ -1,37 +1,28 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Extensions.Caching.Distributed; +using System.Threading.Tasks; using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Caching; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Entities.Events; using Volo.Abp.EventBus; -using Volo.Abp.Json; using Volo.Abp.MultiTenancy; -using Volo.Abp.Threading; namespace Volo.Abp.Permissions { //TODO: Extract cache invalidate logic to another class - public class PermissionStore : AbpServiceBase, IPermissionStore, IAsyncEventHandler>, ITransientDependency + public class PermissionStore : IPermissionStore, IAsyncEventHandler>, ITransientDependency { - private readonly IPermissionGrantRepository _permissionGrantRepository; - private readonly ICurrentTenant _currentTenant; - private readonly ICancellationTokenProvider _cancellationTokenProvider; - private readonly IDistributedCache _distributedCache; - private readonly IJsonSerializer _jsonSerializer; + protected IPermissionGrantRepository PermissionGrantRepository { get; } + protected IDistributedCache Cache { get; } + protected ICurrentTenant CurrentTenant { get; } public PermissionStore( IPermissionGrantRepository permissionGrantRepository, - IDistributedCache distributedCache, - ICancellationTokenProvider cancellationTokenProvider, - ICurrentTenant currentTenant, - IJsonSerializer jsonSerializer) + IDistributedCache cache, + ICurrentTenant currentTenant) { - _permissionGrantRepository = permissionGrantRepository; - _distributedCache = distributedCache; - _cancellationTokenProvider = cancellationTokenProvider; - _currentTenant = currentTenant; - _jsonSerializer = jsonSerializer; + PermissionGrantRepository = permissionGrantRepository; + Cache = cache; + CurrentTenant = currentTenant; } public async Task IsGrantedAsync(string name, string providerName, string providerKey) @@ -39,53 +30,46 @@ namespace Volo.Abp.Permissions return (await GetCacheItemAsync(name, providerName, providerKey)).IsGranted; } - public virtual Task HandleEventAsync(EntityChangedEventData eventData) + public virtual async Task HandleEventAsync(EntityChangedEventData eventData) { - return _distributedCache.RemoveAsync( - CalculateCacheKey( - eventData.Entity.Name, - eventData.Entity.ProviderName, - eventData.Entity.ProviderKey, - eventData.Entity.TenantId - ) + var cacheKey = CalculateCacheKey( + eventData.Entity.Name, + eventData.Entity.ProviderName, + eventData.Entity.ProviderKey ); + + using (CurrentTenant.Change(eventData.Entity.TenantId)) + { + await Cache.RemoveAsync(cacheKey); + } } protected virtual async Task GetCacheItemAsync(string name, string providerName, string providerKey) { - var cacheKey = CalculateCacheKey(name, providerName, providerKey, _currentTenant.Id); - var cachedString = await _distributedCache.GetStringAsync(cacheKey, _cancellationTokenProvider.Token); + var cacheKey = CalculateCacheKey(name, providerName, providerKey); + var cacheItem = await Cache.GetAsync(cacheKey); - if (cachedString != null) + if (cacheItem != null) { - return _jsonSerializer.Deserialize(cachedString); + return cacheItem; } - var cacheItem = new PermissionGrantCacheItem( + cacheItem = new PermissionGrantCacheItem( name, - await _permissionGrantRepository.FindAsync(name, providerName, providerKey) != null + await PermissionGrantRepository.FindAsync(name, providerName, providerKey) != null ); - await _distributedCache.SetStringAsync( + await Cache.SetAsync( cacheKey, - _jsonSerializer.Serialize(cacheItem), - new DistributedCacheEntryOptions { SlidingExpiration = TimeSpan.FromMinutes(20) }, - _cancellationTokenProvider.Token + cacheItem ); return cacheItem; } - protected virtual string CalculateCacheKey(string name, string providerName, string providerKey, Guid? tenantId) + protected virtual string CalculateCacheKey(string name, string providerName, string providerKey) { - var key = "N:" + "PermissionGrant" + "#P:" + providerName + "#K:" + providerKey + "#N:" + name; - - if (tenantId.HasValue) - { - key += "#T:" + tenantId.Value; - } - - return key; + return "pn:" + providerName + ",pk:" + providerKey + ",n:" + name; } } }