Browse Source

Refactor.

pull/6119/head
maliming 6 years ago
parent
commit
8498f558bf
  1. 1
      framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemotePermissionChecker.cs
  2. 11
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/AlwaysAllowPermissionChecker.cs
  3. 14
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/ClientPermissionValueProvider.cs
  4. 12
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/MultiplePermissionGrantResult.cs
  5. 7
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/NullPermissionStore.cs
  6. 18
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionChecker.cs
  7. 13
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RolePermissionValueProvider.cs
  8. 14
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/UserPermissionValueProvider.cs
  9. 2
      framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Authorization/FakePermissionStore.cs
  10. 9
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrantCacheItem.cs
  11. 73
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs

1
framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemotePermissionChecker.cs

@ -1,4 +1,3 @@
using System.Collections.Generic;
using System.Security.Claims; using System.Security.Claims;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.Permissions;

11
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/AlwaysAllowPermissionChecker.cs

@ -1,6 +1,4 @@
using System.Collections.Generic; using System.Security.Claims;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Threading; using Volo.Abp.Threading;
@ -31,12 +29,7 @@ namespace Volo.Abp.Authorization.Permissions
public Task<MultiplePermissionGrantResult> IsGrantedAsync(ClaimsPrincipal claimsPrincipal, string[] names) public Task<MultiplePermissionGrantResult> IsGrantedAsync(ClaimsPrincipal claimsPrincipal, string[] names)
{ {
var result = new MultiplePermissionGrantResult(); return Task.FromResult(new MultiplePermissionGrantResult(names, PermissionGrantResult.Granted));
foreach (var name in names)
{
result.Result.Add(name, PermissionGrantResult.Granted);
}
return Task.FromResult(result);
} }
} }
} }

14
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/ClientPermissionValueProvider.cs

@ -1,5 +1,4 @@
using System.Collections.Generic; using System.Linq;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Security.Claims; using Volo.Abp.Security.Claims;
@ -33,20 +32,15 @@ namespace Volo.Abp.Authorization.Permissions
public async override Task<MultiplePermissionGrantResult> CheckAsync(PermissionValuesCheckContext context) public async override Task<MultiplePermissionGrantResult> CheckAsync(PermissionValuesCheckContext context)
{ {
var result = new MultiplePermissionGrantResult(); var permissionNames = context.Permissions.Select(x => x.Name).ToArray();
var permissionNames = context.Permissions.Select(x => x.Name).ToList();
foreach (var name in permissionNames)
{
result.Result.Add(name, PermissionGrantResult.Undefined);
}
var clientId = context.Principal?.FindFirst(AbpClaimTypes.ClientId)?.Value; var clientId = context.Principal?.FindFirst(AbpClaimTypes.ClientId)?.Value;
if (clientId == null) if (clientId == null)
{ {
return result; return new MultiplePermissionGrantResult(permissionNames);;
} }
return await PermissionStore.IsGrantedAsync(permissionNames.ToArray(), Name, clientId); return await PermissionStore.IsGrantedAsync(permissionNames, Name, clientId);
} }
} }
} }

12
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/MultiplePermissionGrantResult.cs

@ -27,5 +27,17 @@ namespace Volo.Abp.Authorization.Permissions
{ {
Result = new Dictionary<string, PermissionGrantResult>(); Result = new Dictionary<string, PermissionGrantResult>();
} }
public MultiplePermissionGrantResult(string[] names, PermissionGrantResult grantResult = PermissionGrantResult.Undefined)
{
Check.NotNull(names, nameof(names));
Result = new Dictionary<string, PermissionGrantResult>();
foreach (var name in names)
{
Result.Add(name, grantResult);
}
}
} }
} }

7
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/NullPermissionStore.cs

@ -22,12 +22,7 @@ namespace Volo.Abp.Authorization.Permissions
public Task<MultiplePermissionGrantResult> IsGrantedAsync(string[] names, string providerName, string providerKey) public Task<MultiplePermissionGrantResult> IsGrantedAsync(string[] names, string providerName, string providerKey)
{ {
var result = new MultiplePermissionGrantResult(); return Task.FromResult(new MultiplePermissionGrantResult(names, PermissionGrantResult.Prohibited));
foreach (var name in names)
{
result.Result.Add(name, PermissionGrantResult.Prohibited);
}
return Task.FromResult(result);
} }
} }
} }

18
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionChecker.cs

@ -88,12 +88,15 @@ namespace Volo.Abp.Authorization.Permissions
{ {
Check.NotNull(names, nameof(names)); Check.NotNull(names, nameof(names));
var multiTenancySide = claimsPrincipal?.GetMultiTenancySide() var multiTenancySide = claimsPrincipal?.GetMultiTenancySide() ?? CurrentTenant.GetMultiTenancySide();
?? CurrentTenant.GetMultiTenancySide();
var result = new MultiplePermissionGrantResult(); var result = new MultiplePermissionGrantResult();
if (!names.Any())
{
return result;
}
var definitions = new List<PermissionDefinition>(); var permissionDefinitions = new List<PermissionDefinition>();
foreach (var name in names) foreach (var name in names)
{ {
var permission = PermissionDefinitionManager.Get(name); var permission = PermissionDefinitionManager.Get(name);
@ -104,22 +107,23 @@ namespace Volo.Abp.Authorization.Permissions
} }
result.Result.Add(name, PermissionGrantResult.Undefined); result.Result.Add(name, PermissionGrantResult.Undefined);
definitions.Add(permission); permissionDefinitions.Add(permission);
} }
foreach (var provider in PermissionValueProviderManager.ValueProviders) foreach (var provider in PermissionValueProviderManager.ValueProviders)
{ {
var context = new PermissionValuesCheckContext(definitions.Where(x => !x.Providers.Any() || x.Providers.Contains(provider.Name)).ToList(), var context = new PermissionValuesCheckContext(permissionDefinitions.Where(x => !x.Providers.Any() || x.Providers.Contains(provider.Name)).ToList(),
claimsPrincipal); claimsPrincipal);
foreach (var grantResult in (await provider.CheckAsync(context)).Result) var multipleResult = await provider.CheckAsync(context);
foreach (var grantResult in multipleResult.Result)
{ {
if (result.Result.ContainsKey(grantResult.Key) && if (result.Result.ContainsKey(grantResult.Key) &&
result.Result[grantResult.Key] == PermissionGrantResult.Undefined && result.Result[grantResult.Key] == PermissionGrantResult.Undefined &&
grantResult.Value != PermissionGrantResult.Undefined) grantResult.Value != PermissionGrantResult.Undefined)
{ {
result.Result[grantResult.Key] = grantResult.Value; result.Result[grantResult.Key] = grantResult.Value;
definitions.Remove(definitions.First(x => x.Name == grantResult.Key)); permissionDefinitions.RemoveAll(x => x.Name == grantResult.Key);
} }
if (result.AllGranted || result.AllProhibited) if (result.AllGranted || result.AllProhibited)

13
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RolePermissionValueProvider.cs

@ -39,12 +39,8 @@ namespace Volo.Abp.Authorization.Permissions
public async override Task<MultiplePermissionGrantResult> CheckAsync(PermissionValuesCheckContext context) public async override Task<MultiplePermissionGrantResult> CheckAsync(PermissionValuesCheckContext context)
{ {
var result = new MultiplePermissionGrantResult();
var permissionNames = context.Permissions.Select(x => x.Name).ToList(); var permissionNames = context.Permissions.Select(x => x.Name).ToList();
foreach (var name in permissionNames) var result = new MultiplePermissionGrantResult(permissionNames.ToArray());
{
result.Result.Add(name, PermissionGrantResult.Undefined);
}
var roles = context.Principal?.FindAll(AbpClaimTypes.Role).Select(c => c.Value).ToArray(); var roles = context.Principal?.FindAll(AbpClaimTypes.Role).Select(c => c.Value).ToArray();
if (roles == null || !roles.Any()) if (roles == null || !roles.Any())
@ -54,18 +50,19 @@ namespace Volo.Abp.Authorization.Permissions
foreach (var role in roles) foreach (var role in roles)
{ {
foreach (var grantResult in (await PermissionStore.IsGrantedAsync(permissionNames.ToArray(), Name, role)).Result) var multipleResult = await PermissionStore.IsGrantedAsync(permissionNames.ToArray(), Name, role);
foreach (var grantResult in multipleResult.Result)
{ {
if (result.Result.ContainsKey(grantResult.Key) && if (result.Result.ContainsKey(grantResult.Key) &&
result.Result[grantResult.Key] == PermissionGrantResult.Undefined && result.Result[grantResult.Key] == PermissionGrantResult.Undefined &&
grantResult.Value != PermissionGrantResult.Undefined) grantResult.Value != PermissionGrantResult.Undefined)
{ {
result.Result[grantResult.Key] = grantResult.Value; result.Result[grantResult.Key] = grantResult.Value;
permissionNames.Remove(grantResult.Key); permissionNames.RemoveAll(x => x == grantResult.Key);
} }
} }
if (result.AllGranted) if (result.AllGranted || result.AllProhibited)
{ {
break; break;
} }

14
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/UserPermissionValueProvider.cs

@ -1,5 +1,4 @@
using System.Collections.Generic; using System.Linq;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Security.Claims; using Volo.Abp.Security.Claims;
@ -33,20 +32,15 @@ namespace Volo.Abp.Authorization.Permissions
public async override Task<MultiplePermissionGrantResult> CheckAsync(PermissionValuesCheckContext context) public async override Task<MultiplePermissionGrantResult> CheckAsync(PermissionValuesCheckContext context)
{ {
var result = new MultiplePermissionGrantResult(); var permissionNames = context.Permissions.Select(x => x.Name).ToArray();
var permissionNames = context.Permissions.Select(x => x.Name).ToList();
foreach (var name in permissionNames)
{
result.Result.Add(name, PermissionGrantResult.Undefined);
}
var userId = context.Principal?.FindFirst(AbpClaimTypes.UserId)?.Value; var userId = context.Principal?.FindFirst(AbpClaimTypes.UserId)?.Value;
if (userId == null) if (userId == null)
{ {
return result; return new MultiplePermissionGrantResult(permissionNames);
} }
return await PermissionStore.IsGrantedAsync(permissionNames.ToArray(), Name, userId); return await PermissionStore.IsGrantedAsync(permissionNames, Name, userId);
} }
} }
} }

2
framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Authorization/FakePermissionStore.cs

@ -24,7 +24,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Authorization
providerName == UserPermissionValueProvider.ProviderName && providerName == UserPermissionValueProvider.ProviderName &&
providerKey == AuthTestController.FakeUserId.ToString() providerKey == AuthTestController.FakeUserId.ToString()
? PermissionGrantResult.Granted ? PermissionGrantResult.Granted
: PermissionGrantResult.Undefined); : PermissionGrantResult.Prohibited);
} }
return Task.FromResult(result); return Task.FromResult(result);

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

@ -7,6 +7,8 @@ namespace Volo.Abp.PermissionManagement
[Serializable] [Serializable]
public class PermissionGrantCacheItem public class PermissionGrantCacheItem
{ {
private const string CacheKeyFormat = "pn:{0},pk:{1},n:{2}";
public bool IsGranted { get; set; } public bool IsGranted { get; set; }
public PermissionGrantCacheItem() public PermissionGrantCacheItem()
@ -21,13 +23,12 @@ namespace Volo.Abp.PermissionManagement
public static string CalculateCacheKey(string name, string providerName, string providerKey) public static string CalculateCacheKey(string name, string providerName, string providerKey)
{ {
return "pn:" + providerName + ",pk:" + providerKey + ",n:" + name; return string.Format(CacheKeyFormat, providerName, providerKey, name);
} }
public static string ParseCacheKeyOrNull(string key) public static string GetPermissionNameFormCacheKeyOrNull(string cacheKey)
{ {
var format = "pn:{0},pk:{1},n:{2}"; var result = FormattedStringValueExtracter.Extract(cacheKey, CacheKeyFormat, true);
var result = FormattedStringValueExtracter.Extract(key, format, true);
return result.IsMatch ? result.Matches.Last().Value : null; return result.IsMatch ? result.Matches.Last().Value : null;
} }
} }

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

@ -35,21 +35,6 @@ namespace Volo.Abp.PermissionManagement
return (await GetCacheItemAsync(name, providerName, providerKey)).IsGranted; return (await GetCacheItemAsync(name, providerName, providerKey)).IsGranted;
} }
public virtual async Task<MultiplePermissionGrantResult> IsGrantedAsync(string[] names, string providerName, string providerKey)
{
var result = new MultiplePermissionGrantResult();
var cacheItems = await GetCacheItemsAsync(names, providerName, providerKey);
foreach (var item in cacheItems)
{
result.Result.Add(PermissionGrantCacheItem.ParseCacheKeyOrNull(item.Key), item.Value.IsGranted
? PermissionGrantResult.Granted :
PermissionGrantResult.Undefined);
}
return result;
}
protected virtual async Task<PermissionGrantCacheItem> GetCacheItemAsync( protected virtual async Task<PermissionGrantCacheItem> GetCacheItemAsync(
string name, string name,
string providerName, string providerName,
@ -114,27 +99,75 @@ namespace Volo.Abp.PermissionManagement
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)
{
Check.NotNullOrEmpty(names, nameof(names));
var result = new MultiplePermissionGrantResult();
if (names.Length == 1)
{
var name = names.First();
result.Result.Add(name,
await IsGrantedAsync(names.First(), providerName, providerKey)
? PermissionGrantResult.Granted
: PermissionGrantResult.Undefined);
return result;
}
var cacheItems = await GetCacheItemsAsync(names, providerName, providerKey);
foreach (var item in cacheItems)
{
result.Result.Add(PermissionGrantCacheItem.GetPermissionNameFormCacheKeyOrNull(item.Key),
item.Value.IsGranted
? PermissionGrantResult.Granted
: PermissionGrantResult.Undefined);
}
return result;
}
protected virtual async Task<List<KeyValuePair<string, PermissionGrantCacheItem>>> GetCacheItemsAsync( protected virtual async Task<List<KeyValuePair<string, PermissionGrantCacheItem>>> GetCacheItemsAsync(
string[] names, string[] names,
string providerName, string providerName,
string providerKey) string providerKey)
{ {
var cacheKeys = names.Select(x => CalculateCacheKey(x, providerName, providerKey)).ToList(); var cacheKeys = names.Select(x => CalculateCacheKey(x, providerName, providerKey)).ToList();
Logger.LogDebug($"PermissionStore.GetCacheItemAsync: {string.Join(",", cacheKeys)}");
var cacheItems = (await Cache.GetManyAsync(cacheKeys)).ToList(); var cacheItems = (await Cache.GetManyAsync(cacheKeys)).ToList();
if (cacheItems.All(x => x.Value != null)) if (cacheItems.All(x => x.Value != null))
{ {
Logger.LogDebug($"Found in the cache: {string.Join(",", cacheKeys)}");
return cacheItems; return cacheItems;
} }
return cacheItems.Where(x => x.Value != null) var notCacheKeys = cacheItems.Where(x => x.Value == null).Select(x => x.Key).ToList();
.Union(await SetCacheItemsAsync(providerName, providerKey, cacheItems.Where(x => x.Value == null)))
.ToList(); Logger.LogDebug($"Not found in the cache: {string.Join(",", notCacheKeys)}");
var newCacheItems = await SetCacheItemsAsync(providerName, providerKey, notCacheKeys);
var result = new List<KeyValuePair<string, PermissionGrantCacheItem>>();
foreach (var key in cacheKeys)
{
var item = newCacheItems.FirstOrDefault(x => x.Key == key);
if (item.Value == null)
{
item = cacheItems.FirstOrDefault(x => x.Key == key);
}
result.Add(new KeyValuePair<string, PermissionGrantCacheItem>(key, item.Value));
}
return result;
} }
protected virtual async Task<List<KeyValuePair<string, PermissionGrantCacheItem>>> SetCacheItemsAsync( protected virtual async Task<List<KeyValuePair<string, PermissionGrantCacheItem>>> SetCacheItemsAsync(
string providerName, string providerName,
string providerKey, string providerKey,
IEnumerable<KeyValuePair<string, PermissionGrantCacheItem>> notCacheItems) IEnumerable<string> cacheKeys)
{ {
var permissions = PermissionDefinitionManager.GetPermissions(); var permissions = PermissionDefinitionManager.GetPermissions();
@ -162,7 +195,7 @@ namespace Volo.Abp.PermissionManagement
Logger.LogDebug($"Finished setting the cache items. Count: {permissions.Count}"); Logger.LogDebug($"Finished setting the cache items. Count: {permissions.Count}");
return cacheItems.Where(x => notCacheItems.Any(y => x.Key == y.Key)).ToList(); return cacheItems.Where(x => cacheKeys.Contains(x.Key)).ToList();
} }
protected virtual string CalculateCacheKey(string name, string providerName, string providerKey) protected virtual string CalculateCacheKey(string name, string providerName, string providerKey)

Loading…
Cancel
Save