From 3431a2fdfbfb9c1b66f597decc10e6f613d9612a Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 10 Aug 2021 15:01:21 +0800 Subject: [PATCH 1/6] Optimize the performance of PermissionAppService --- .../RolePermissionManagementProvider.cs | 42 ++++++++++++++- .../PermissionAppService.cs | 53 +++++++++---------- .../IPermissionManagementProvider.cs | 8 ++- .../IPermissionManager.cs | 2 + ...ultiplePermissionValueProviderGrantInfo.cs | 26 +++++++++ .../MultiplePermissionWithGrantedProviders.cs | 26 +++++++++ .../PermissionManagementProvider.cs | 28 ++++++++-- .../PermissionManagement/PermissionManager.cs | 45 ++++++++++++++++ 8 files changed, 198 insertions(+), 32 deletions(-) create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/MultiplePermissionValueProviderGrantInfo.cs create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/MultiplePermissionWithGrantedProviders.cs diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs index 53ebe46fb2..534eef745f 100644 --- a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Guids; @@ -26,7 +28,7 @@ namespace Volo.Abp.PermissionManagement.Identity UserRoleFinder = userRoleFinder; } - public async override Task CheckAsync(string name, string providerName, string providerKey) + public override async Task CheckAsync(string name, string providerName, string providerKey) { if (providerName == Name) { @@ -53,5 +55,43 @@ namespace Volo.Abp.PermissionManagement.Identity return PermissionValueProviderGrantInfo.NonGranted; } + + public override async Task CheckAsync(string[] names, string providerName, string providerKey) + { + var multiplePermissionValueProviderGrantInfo = new MultiplePermissionValueProviderGrantInfo(names); + List permissionGrants = null; + + if (providerName == Name) + { + permissionGrants = await PermissionGrantRepository.GetListAsync(names, providerName, providerKey); + + } + + if (providerName == UserPermissionValueProvider.ProviderName) + { + var userId = Guid.Parse(providerKey); + var roleNames = await UserRoleFinder.GetRolesAsync(userId); + + foreach (var roleName in roleNames) + { + permissionGrants = await PermissionGrantRepository.GetListAsync(names, Name, roleName); + } + } + + if (permissionGrants == null) + { + return multiplePermissionValueProviderGrantInfo; + } + + foreach (var permissionName in names) + { + if (permissionGrants.Any(x => x.Name == permissionName)) + { + multiplePermissionValueProviderGrantInfo.Result[permissionName] = new PermissionValueProviderGrantInfo(true, providerKey); + } + } + + return multiplePermissionValueProviderGrantInfo; + } } } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs index abcbcd6a48..41b986c2f4 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Options; using Volo.Abp.Application.Services; using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Features; using Volo.Abp.MultiTenancy; using Volo.Abp.SimpleStateChecking; @@ -19,16 +20,19 @@ namespace Volo.Abp.PermissionManagement protected IPermissionDefinitionManager PermissionDefinitionManager { get; } protected ISimpleStateCheckerManager SimpleStateCheckerManager { get; } + private readonly IPermissionChecker _permissionChecker; + public PermissionAppService( IPermissionManager permissionManager, IPermissionDefinitionManager permissionDefinitionManager, IOptions options, - ISimpleStateCheckerManager simpleStateCheckerManager) + ISimpleStateCheckerManager simpleStateCheckerManager, IPermissionChecker permissionChecker) { Options = options.Value; PermissionManager = permissionManager; PermissionDefinitionManager = permissionDefinitionManager; SimpleStateCheckerManager = simpleStateCheckerManager; + _permissionChecker = permissionChecker; } public virtual async Task GetAsync(string providerName, string providerKey) @@ -52,38 +56,33 @@ namespace Volo.Abp.PermissionManagement Permissions = new List() }; - foreach (var permission in group.GetPermissionsWithChildren()) - { - if (!permission.IsEnabled) - { - continue; - } + var neededCheckPermissions = new List(); - if (!await SimpleStateCheckerManager.IsEnabledAsync(permission)) + foreach (var permission in group.GetPermissionsWithChildren() + .Where(x => x.IsEnabled) + .Where(x => !x.Providers.Any() || x.Providers.Contains(providerName)) + .Where(x => x.MultiTenancySide.HasFlag(multiTenancySide))) + { + if (await SimpleStateCheckerManager.IsEnabledAsync(permission)) { - continue; + neededCheckPermissions.Add(permission); } + } - if (permission.Providers.Any() && !permission.Providers.Contains(providerName)) - { - continue; - } + var grantInfoDtos = neededCheckPermissions.Select(x => new PermissionGrantInfoDto + { + Name = x.Name, + DisplayName = x.DisplayName.Localize(StringLocalizerFactory), + ParentName = x.Parent?.Name, + AllowedProviders = x.Providers, + GrantedProviders = new List() + }).ToList(); - if (!permission.MultiTenancySide.HasFlag(multiTenancySide)) - { - continue; - } + var multipleGrantInfo = await PermissionManager.GetAsync(neededCheckPermissions.Select(x=>x.Name).ToArray(), providerName, providerKey); - var grantInfoDto = new PermissionGrantInfoDto - { - Name = permission.Name, - DisplayName = permission.DisplayName.Localize(StringLocalizerFactory), - ParentName = permission.Parent?.Name, - AllowedProviders = permission.Providers, - GrantedProviders = new List() - }; - - var grantInfo = await PermissionManager.GetAsync(permission.Name, providerName, providerKey); + foreach (var grantInfo in multipleGrantInfo.Result) + { + var grantInfoDto = grantInfoDtos.First(x => x.Name == grantInfo.Name); grantInfoDto.IsGranted = grantInfo.IsGranted; diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionManagementProvider.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionManagementProvider.cs index 9ee60b0a93..6184960903 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionManagementProvider.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionManagementProvider.cs @@ -15,10 +15,16 @@ namespace Volo.Abp.PermissionManagement [NotNull] string providerKey ); + Task CheckAsync( + [NotNull] string[] names, + [NotNull] string providerName, + [NotNull] string providerKey + ); + Task SetAsync( [NotNull] string name, [NotNull] string providerKey, bool isGranted ); } -} \ No newline at end of file +} diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionManager.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionManager.cs index 70bb83a7d0..862158bbdb 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionManager.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionManager.cs @@ -10,6 +10,8 @@ namespace Volo.Abp.PermissionManagement { Task GetAsync(string permissionName, string providerName, string providerKey); + Task GetAsync(string[] permissionNames, string provideName, string providerKey); + Task> GetAllAsync([NotNull] string providerName, [NotNull] string providerKey); Task SetAsync(string permissionName, string providerName, string providerKey, bool isGranted); diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/MultiplePermissionValueProviderGrantInfo.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/MultiplePermissionValueProviderGrantInfo.cs new file mode 100644 index 0000000000..ea0e62c955 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/MultiplePermissionValueProviderGrantInfo.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + +namespace Volo.Abp.PermissionManagement +{ + public class MultiplePermissionValueProviderGrantInfo + { + public Dictionary Result { get; } + + public MultiplePermissionValueProviderGrantInfo() + { + Result = new Dictionary(); + } + + public MultiplePermissionValueProviderGrantInfo(string[] names) + { + Check.NotNull(names, nameof(names)); + + Result = new Dictionary(); + + foreach (var name in names) + { + Result.Add(name, PermissionValueProviderGrantInfo.NonGranted); + } + } + } +} diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/MultiplePermissionWithGrantedProviders.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/MultiplePermissionWithGrantedProviders.cs new file mode 100644 index 0000000000..c18cad9acb --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/MultiplePermissionWithGrantedProviders.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + +namespace Volo.Abp.PermissionManagement +{ + public class MultiplePermissionWithGrantedProviders + { + public List Result { get; } + + public MultiplePermissionWithGrantedProviders() + { + Result = new List(); + } + + public MultiplePermissionWithGrantedProviders(string[] names) + { + Check.NotNull(names, nameof(names)); + + Result = new List(); + + foreach (var name in names) + { + Result.Add(new PermissionWithGrantedProviders(name, false)); + } + } + } +} diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs index 0b83f37fd1..8e17228846 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Linq; +using System.Threading.Tasks; using Volo.Abp.Guids; using Volo.Abp.MultiTenancy; @@ -23,7 +24,7 @@ namespace Volo.Abp.PermissionManagement GuidGenerator = guidGenerator; CurrentTenant = currentTenant; } - + public virtual async Task CheckAsync(string name, string providerName, string providerKey) { if (providerName != Name) @@ -37,6 +38,27 @@ namespace Volo.Abp.PermissionManagement ); } + public virtual async Task CheckAsync(string[] names, string providerName, string providerKey) + { + var multiplePermissionValueProviderGrantInfo = new MultiplePermissionValueProviderGrantInfo(names); + if (providerName != Name) + { + return multiplePermissionValueProviderGrantInfo; + } + + var permissionGrants = await PermissionGrantRepository.GetListAsync(names, providerName, providerKey); + + foreach (var permissionName in names) + { + if (permissionGrants.Any(x => x.Name == permissionName)) + { + multiplePermissionValueProviderGrantInfo.Result[permissionName] = new PermissionValueProviderGrantInfo(true, providerKey); + } + } + + return multiplePermissionValueProviderGrantInfo; + } + public virtual Task SetAsync(string name, string providerKey, bool isGranted) { return isGranted @@ -74,4 +96,4 @@ namespace Volo.Abp.PermissionManagement await PermissionGrantRepository.DeleteAsync(permissionGrant); } } -} \ No newline at end of file +} diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs index d0ee7c4853..691c39e92b 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs @@ -65,6 +65,12 @@ namespace Volo.Abp.PermissionManagement return await GetInternalAsync(PermissionDefinitionManager.Get(permissionName), providerName, providerKey); } + public virtual async Task GetAsync(string[] permissionNames, string providerName, string providerKey) + { + var permissionDefinitions = permissionNames.Select(x => PermissionDefinitionManager.Get(x)).ToArray(); + return await GetInternalAsync(permissionDefinitions, providerName, providerKey); + } + public virtual async Task> GetAllAsync(string providerName, string providerKey) { var results = new List(); @@ -178,5 +184,44 @@ namespace Volo.Abp.PermissionManagement return result; } + + protected virtual async Task GetInternalAsync(PermissionDefinition[] permissions, string providerName, string providerKey) + { + var permissionNames = permissions.Select(x => x.Name).ToArray(); + var multiplePermissionWithGrantedProviders = new MultiplePermissionWithGrantedProviders(permissionNames); + + var neededCheckPermissions = new List(); + + foreach (var permission in permissions + .Where(x => x.IsEnabled) + .Where(x => x.MultiTenancySide.HasFlag(CurrentTenant.GetMultiTenancySide())) + .Where(x => !x.Providers.Any() || x.Providers.Contains(providerName))) + { + if (await SimpleStateCheckerManager.IsEnabledAsync(permission)) + { + neededCheckPermissions.Add(permission); + } + } + + foreach (var provider in ManagementProviders) + { + permissionNames = neededCheckPermissions.Select(x => x.Name).ToArray(); + var multiplePermissionValueProviderGrantInfo = await provider.CheckAsync(permissionNames, providerName, providerKey); + + foreach (var providerResultDict in multiplePermissionValueProviderGrantInfo.Result) + { + if (providerResultDict.Value.IsGranted) + { + var permissionWithGrantedProvider = multiplePermissionWithGrantedProviders.Result + .First(x => x.Name == providerResultDict.Key); + + permissionWithGrantedProvider.IsGranted = true; + permissionWithGrantedProvider.Providers.Add(new PermissionValueProviderInfo(provider.Name, providerResultDict.Value.ProviderKey)); + } + } + } + + return multiplePermissionWithGrantedProviders; + } } } From c8eefb5bc4add88d9b0461d81558c22385a01dfb Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 10 Aug 2021 17:50:43 +0800 Subject: [PATCH 2/6] Improved --- .../RolePermissionManagementProvider.cs | 30 +++------------- .../PermissionManagement/PermissionManager.cs | 34 ++----------------- 2 files changed, 7 insertions(+), 57 deletions(-) diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs index 534eef745f..d1af0a0c90 100644 --- a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs @@ -30,30 +30,9 @@ namespace Volo.Abp.PermissionManagement.Identity public override async Task CheckAsync(string name, string providerName, string providerKey) { - if (providerName == Name) - { - return new PermissionValueProviderGrantInfo( - await PermissionGrantRepository.FindAsync(name, providerName, providerKey) != null, - providerKey - ); - } - - if (providerName == UserPermissionValueProvider.ProviderName) - { - var userId = Guid.Parse(providerKey); - var roleNames = await UserRoleFinder.GetRolesAsync(userId); - - foreach (var roleName in roleNames) - { - var permissionGrant = await PermissionGrantRepository.FindAsync(name, Name, roleName); - if (permissionGrant != null) - { - return new PermissionValueProviderGrantInfo(true, roleName); - } - } - } + var multipleGrantInfo = await CheckAsync(new[] {name}, providerName, providerKey); - return PermissionValueProviderGrantInfo.NonGranted; + return multipleGrantInfo.Result.Values.First(); } public override async Task CheckAsync(string[] names, string providerName, string providerKey) @@ -85,9 +64,10 @@ namespace Volo.Abp.PermissionManagement.Identity foreach (var permissionName in names) { - if (permissionGrants.Any(x => x.Name == permissionName)) + var permissionGrant = permissionGrants.FirstOrDefault(x => x.Name == permissionName); + if (permissionGrant != null) { - multiplePermissionValueProviderGrantInfo.Result[permissionName] = new PermissionValueProviderGrantInfo(true, providerKey); + multiplePermissionValueProviderGrantInfo.Result[permissionName] = new PermissionValueProviderGrantInfo(true, permissionGrant.ProviderKey); } } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs index 691c39e92b..2c340c3d7c 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs @@ -150,39 +150,9 @@ namespace Volo.Abp.PermissionManagement protected virtual async Task GetInternalAsync(PermissionDefinition permission, string providerName, string providerKey) { - var result = new PermissionWithGrantedProviders(permission.Name, false); + var multiplePermissionWithGrantedProviders = await GetInternalAsync(new PermissionDefinition[]{permission}, providerName, providerKey); - if (!permission.IsEnabled) - { - return result; - } - - if (!await SimpleStateCheckerManager.IsEnabledAsync(permission)) - { - return result; - } - - if (!permission.MultiTenancySide.HasFlag(CurrentTenant.GetMultiTenancySide())) - { - return result; - } - - if (permission.Providers.Any() && !permission.Providers.Contains(providerName)) - { - return result; - } - - foreach (var provider in ManagementProviders) - { - var providerResult = await provider.CheckAsync(permission.Name, providerName, providerKey); - if (providerResult.IsGranted) - { - result.IsGranted = true; - result.Providers.Add(new PermissionValueProviderInfo(provider.Name, providerResult.ProviderKey)); - } - } - - return result; + return multiplePermissionWithGrantedProviders.Result.First(); } protected virtual async Task GetInternalAsync(PermissionDefinition[] permissions, string providerName, string providerKey) From 61d5639d086051ca47572669e511f09433bf1f42 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 10 Aug 2021 18:09:01 +0800 Subject: [PATCH 3/6] Add unit tests --- .../PermissionManagementProvider.cs | 10 ++---- .../PermissionManager_Tests.cs | 31 +++++++++++++++++++ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs index 8e17228846..178ae1f94c 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs @@ -27,15 +27,9 @@ namespace Volo.Abp.PermissionManagement public virtual async Task CheckAsync(string name, string providerName, string providerKey) { - if (providerName != Name) - { - return PermissionValueProviderGrantInfo.NonGranted; - } + var multiplePermissionValueProviderGrantInfo = await CheckAsync(new[] {name}, providerName, providerKey); - return new PermissionValueProviderGrantInfo( - await PermissionGrantRepository.FindAsync(name, providerName, providerKey) != null, - providerKey - ); + return multiplePermissionValueProviderGrantInfo.Result.First().Value; } public virtual async Task CheckAsync(string[] names, string providerName, string providerKey) diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs index 07d279ec9d..1a4ea721cc 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs @@ -40,6 +40,37 @@ namespace Volo.Abp.PermissionManagement grantedProviders.Providers.ShouldContain(x => x.Key == "Test"); } + [Fact] + public async Task Multiple_GetAsync() + { + await _permissionGrantRepository.InsertAsync(new PermissionGrant( + Guid.NewGuid(), + "MyPermission1", + "Test", + "Test") + ); + await _permissionGrantRepository.InsertAsync(new PermissionGrant( + Guid.NewGuid(), + "MyPermission2", + "Test", + "Test") + ); + + var grantedProviders = await _permissionManager.GetAsync( + new[] {"MyPermission1", "MyPermission2"}, + "Test", + "Test"); + + grantedProviders.Result.Count.ShouldBe(2); + grantedProviders.Result.First().IsGranted.ShouldBeTrue(); + grantedProviders.Result.First().Name.ShouldBe("MyPermission1"); + grantedProviders.Result.First().Providers.ShouldContain(x => x.Key == "Test"); + + grantedProviders.Result.Last().IsGranted.ShouldBeTrue(); + grantedProviders.Result.Last().Name.ShouldBe("MyPermission2"); + grantedProviders.Result.Last().Providers.ShouldContain(x => x.Key == "Test"); + } + [Fact] public async Task Get_Should_Exception_When_Permission_Undefined() { From 6b1daeaef662505af5d90b891cb3d52553bc4221 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 11 Aug 2021 10:40:56 +0800 Subject: [PATCH 4/6] Improved --- .../RolePermissionManagementProvider.cs | 9 ++++---- .../PermissionAppService.cs | 5 ++++ .../PermissionManagementProvider.cs | 6 ++--- .../PermissionManagement/PermissionManager.cs | 15 +++++++----- ...ProjectNamePermissionDefinitionProvider.cs | 23 ++++++++++++++++++- 5 files changed, 43 insertions(+), 15 deletions(-) diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs index d1af0a0c90..7b2fb4344e 100644 --- a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs @@ -38,11 +38,11 @@ namespace Volo.Abp.PermissionManagement.Identity public override async Task CheckAsync(string[] names, string providerName, string providerKey) { var multiplePermissionValueProviderGrantInfo = new MultiplePermissionValueProviderGrantInfo(names); - List permissionGrants = null; + var permissionGrants = new List(); if (providerName == Name) { - permissionGrants = await PermissionGrantRepository.GetListAsync(names, providerName, providerKey); + permissionGrants.AddRange(await PermissionGrantRepository.GetListAsync(names, providerName, providerKey)); } @@ -53,11 +53,12 @@ namespace Volo.Abp.PermissionManagement.Identity foreach (var roleName in roleNames) { - permissionGrants = await PermissionGrantRepository.GetListAsync(names, Name, roleName); + permissionGrants.AddRange(await PermissionGrantRepository.GetListAsync(names, Name, roleName)); } } - if (permissionGrants == null) + permissionGrants = permissionGrants.Distinct().ToList(); + if (!permissionGrants.Any()) { return multiplePermissionValueProviderGrantInfo; } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs index 41b986c2f4..a8575b424b 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs @@ -69,6 +69,11 @@ namespace Volo.Abp.PermissionManagement } } + if (!neededCheckPermissions.Any()) + { + return result; + } + var grantInfoDtos = neededCheckPermissions.Select(x => new PermissionGrantInfoDto { Name = x.Name, diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs index 178ae1f94c..ccb2cae951 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs @@ -44,10 +44,8 @@ namespace Volo.Abp.PermissionManagement foreach (var permissionName in names) { - if (permissionGrants.Any(x => x.Name == permissionName)) - { - multiplePermissionValueProviderGrantInfo.Result[permissionName] = new PermissionValueProviderGrantInfo(true, providerKey); - } + var isGrant = permissionGrants.Any(x => x.Name == permissionName); + multiplePermissionValueProviderGrantInfo.Result[permissionName] = new PermissionValueProviderGrantInfo(isGrant, providerKey); } return multiplePermissionValueProviderGrantInfo; diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs index 2c340c3d7c..7d6193d1ce 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs @@ -73,14 +73,12 @@ namespace Volo.Abp.PermissionManagement public virtual async Task> GetAllAsync(string providerName, string providerKey) { - var results = new List(); + var permissionDefinitions = PermissionDefinitionManager.GetPermissions().ToArray(); - foreach (var permissionDefinition in PermissionDefinitionManager.GetPermissions()) - { - results.Add(await GetInternalAsync(permissionDefinition, providerName, providerKey)); - } + var multiplePermissionWithGrantedProviders = await GetInternalAsync(permissionDefinitions, providerName, providerKey); + + return multiplePermissionWithGrantedProviders.Result; - return results; } public virtual async Task SetAsync(string permissionName, string providerName, string providerKey, bool isGranted) @@ -173,6 +171,11 @@ namespace Volo.Abp.PermissionManagement } } + if (!neededCheckPermissions.Any()) + { + return multiplePermissionWithGrantedProviders; + } + foreach (var provider in ManagementProviders) { permissionNames = neededCheckPermissions.Select(x => x.Name).ToArray(); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/Permissions/MyProjectNamePermissionDefinitionProvider.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/Permissions/MyProjectNamePermissionDefinitionProvider.cs index 631beb6b6d..011dfc5cbc 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/Permissions/MyProjectNamePermissionDefinitionProvider.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/Permissions/MyProjectNamePermissionDefinitionProvider.cs @@ -11,7 +11,28 @@ namespace MyCompanyName.MyProjectName.Permissions var myGroup = context.AddGroup(MyProjectNamePermissions.GroupName); //Define your own permissions here. Example: - //myGroup.AddPermission(MyProjectNamePermissions.MyPermission1, L("Permission:MyPermission1")); + myGroup.AddPermission("permission1", L("Permission:MyPermission1")); + myGroup.AddPermission("permission2", L("Permission:MyPermission1")); + myGroup.AddPermission("permission3", L("Permission:MyPermission1")); + myGroup.AddPermission("permission4", L("Permission:MyPermission1")); + myGroup.AddPermission("permission5", L("Permission:MyPermission1")); + myGroup.AddPermission("permission6", L("Permission:MyPermission1")); + myGroup.AddPermission("permission7", L("Permission:MyPermission1")); + myGroup.AddPermission("permission8", L("Permission:MyPermission1")); + myGroup.AddPermission("permission9", L("Permission:MyPermission1")); + myGroup.AddPermission("permission10", L("Permission:MyPermission1")); + myGroup.AddPermission("permission11", L("Permission:MyPermission1")); + myGroup.AddPermission("permission12", L("Permission:MyPermission1")); + myGroup.AddPermission("permission13", L("Permission:MyPermission1")); + myGroup.AddPermission("permission14", L("Permission:MyPermission1")); + myGroup.AddPermission("permission15", L("Permission:MyPermission1")); + myGroup.AddPermission("permission16", L("Permission:MyPermission1")); + myGroup.AddPermission("permission17", L("Permission:MyPermission1")); + myGroup.AddPermission("permission18", L("Permission:MyPermission1")); + myGroup.AddPermission("permission19", L("Permission:MyPermission1")); + myGroup.AddPermission("permission20", L("Permission:MyPermission1")); + myGroup.AddPermission("permission21", L("Permission:MyPermission1")); + myGroup.AddPermission("permission22", L("Permission:MyPermission1")); } private static LocalizableString L(string name) From 5bb1c1bd627ca2bdff2bb63a016638b2d0e0a19b Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 11 Aug 2021 10:43:00 +0800 Subject: [PATCH 5/6] Update MyProjectNamePermissionDefinitionProvider.cs --- ...ProjectNamePermissionDefinitionProvider.cs | 24 +------------------ 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/Permissions/MyProjectNamePermissionDefinitionProvider.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/Permissions/MyProjectNamePermissionDefinitionProvider.cs index 011dfc5cbc..569fa7b6a7 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/Permissions/MyProjectNamePermissionDefinitionProvider.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/Permissions/MyProjectNamePermissionDefinitionProvider.cs @@ -9,30 +9,8 @@ namespace MyCompanyName.MyProjectName.Permissions public override void Define(IPermissionDefinitionContext context) { var myGroup = context.AddGroup(MyProjectNamePermissions.GroupName); - //Define your own permissions here. Example: - myGroup.AddPermission("permission1", L("Permission:MyPermission1")); - myGroup.AddPermission("permission2", L("Permission:MyPermission1")); - myGroup.AddPermission("permission3", L("Permission:MyPermission1")); - myGroup.AddPermission("permission4", L("Permission:MyPermission1")); - myGroup.AddPermission("permission5", L("Permission:MyPermission1")); - myGroup.AddPermission("permission6", L("Permission:MyPermission1")); - myGroup.AddPermission("permission7", L("Permission:MyPermission1")); - myGroup.AddPermission("permission8", L("Permission:MyPermission1")); - myGroup.AddPermission("permission9", L("Permission:MyPermission1")); - myGroup.AddPermission("permission10", L("Permission:MyPermission1")); - myGroup.AddPermission("permission11", L("Permission:MyPermission1")); - myGroup.AddPermission("permission12", L("Permission:MyPermission1")); - myGroup.AddPermission("permission13", L("Permission:MyPermission1")); - myGroup.AddPermission("permission14", L("Permission:MyPermission1")); - myGroup.AddPermission("permission15", L("Permission:MyPermission1")); - myGroup.AddPermission("permission16", L("Permission:MyPermission1")); - myGroup.AddPermission("permission17", L("Permission:MyPermission1")); - myGroup.AddPermission("permission18", L("Permission:MyPermission1")); - myGroup.AddPermission("permission19", L("Permission:MyPermission1")); - myGroup.AddPermission("permission20", L("Permission:MyPermission1")); - myGroup.AddPermission("permission21", L("Permission:MyPermission1")); - myGroup.AddPermission("permission22", L("Permission:MyPermission1")); + //myGroup.AddPermission(MyProjectNamePermissions.MyPermission1, L("Permission:MyPermission1")); } private static LocalizableString L(string name) From 2ac595d2a360cc68fe56c33e9dfec00cf6ad01a5 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 11 Aug 2021 11:39:07 +0800 Subject: [PATCH 6/6] Update PermissionAppService.cs --- .../Volo/Abp/PermissionManagement/PermissionAppService.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs index a8575b424b..d6fd7793c4 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs @@ -20,19 +20,16 @@ namespace Volo.Abp.PermissionManagement protected IPermissionDefinitionManager PermissionDefinitionManager { get; } protected ISimpleStateCheckerManager SimpleStateCheckerManager { get; } - private readonly IPermissionChecker _permissionChecker; - public PermissionAppService( IPermissionManager permissionManager, IPermissionDefinitionManager permissionDefinitionManager, IOptions options, - ISimpleStateCheckerManager simpleStateCheckerManager, IPermissionChecker permissionChecker) + ISimpleStateCheckerManager simpleStateCheckerManager) { Options = options.Value; PermissionManager = permissionManager; PermissionDefinitionManager = permissionDefinitionManager; SimpleStateCheckerManager = simpleStateCheckerManager; - _permissionChecker = permissionChecker; } public virtual async Task GetAsync(string providerName, string providerKey)