diff --git a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionGrantInfo.cs b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionGrantInfo.cs index 3fec6edbc8..6e7d65a90c 100644 --- a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionGrantInfo.cs +++ b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionGrantInfo.cs @@ -8,12 +8,15 @@ namespace Volo.Abp.Permissions public bool IsGranted { get; } - public PermissionGrantInfo([NotNull] string name, bool isGranted) + public string ProviderName { get; } + + public PermissionGrantInfo([NotNull] string name, bool isGranted, [CanBeNull] string providerName = null) { Check.NotNull(name, nameof(name)); Name = name; IsGranted = isGranted; + ProviderName = providerName; } } } \ No newline at end of file diff --git a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionManager.cs b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionManager.cs index 96c93d5364..7edc6a5648 100644 --- a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionManager.cs +++ b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionManager.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; @@ -83,32 +84,15 @@ namespace Volo.Abp.Permissions //TODO: Should also return for non-granted permissions! //TODO: Create a method for getting only granted permissions! - public virtual async Task> GetAllAsync() + public virtual Task> GetAllAsync() { - var permissionGrantInfos = new Dictionary(); - var permissionDefinitions = PermissionDefinitionManager.GetAll(); - - foreach (var provider in Providers.Value) - { - foreach (var permission in permissionDefinitions) - { - var value = await provider.IsGrantedAsync(permission, null); - if (value != null) - { - permissionGrantInfos[permission.Name] = new PermissionGrantInfo(permission.Name, value.Value); - } - } - } - - return permissionGrantInfos.Values.ToList(); + return GetAllFromProvidersAsync(Providers.Value, null); } public virtual async Task> GetAllAsync(string providerName, string providerKey, bool fallback = true) { Check.NotNull(providerName, nameof(providerName)); - var permissionGrantInfos = new Dictionary(); - var permissionDefinitions = PermissionDefinitionManager.GetAll(); var providers = Enumerable.Reverse(Providers.Value) .SkipWhile(c => c.Name != providerName); @@ -119,22 +103,7 @@ namespace Volo.Abp.Permissions var providerList = providers.Reverse().ToList(); - if (providerList.Any()) - { - foreach (var permission in permissionDefinitions) - { - foreach (var provider in providerList) - { - var value = await provider.IsGrantedAsync(permission, providerKey); - if (value != null) - { - permissionGrantInfos[permission.Name] = new PermissionGrantInfo(permission.Name, value.Value); - } - } - } - } - - return permissionGrantInfos.Values.ToList(); + return await GetAllFromProvidersAsync(providerList, providerKey); } public virtual async Task SetAsync(string name, bool? isGranted, string providerName, string providerKey, bool forceToSet = false) @@ -166,7 +135,7 @@ namespace Volo.Abp.Permissions providers = providers .TakeWhile(p => p.Name == providerName) - .ToList(); //Getting list for case of there are more than one provider with same EntityType + .ToList(); //Getting list for case of there are more than one provider with same name if (isGranted == null) { @@ -183,5 +152,28 @@ namespace Volo.Abp.Permissions } } } + + protected virtual async Task> GetAllFromProvidersAsync([NotNull] List providers, [CanBeNull] string providerKey) + { + var permissionDefinitions = PermissionDefinitionManager.GetAll(); + var permissionGrantInfos = new Dictionary(); + + foreach (var permission in permissionDefinitions) + { + permissionGrantInfos[permission.Name] = new PermissionGrantInfo(permission.Name, false); + + foreach (var provider in providers) + { + var value = await provider.IsGrantedAsync(permission, providerKey); + if (value != null) + { + permissionGrantInfos[permission.Name] = + new PermissionGrantInfo(permission.Name, value.Value, provider.Name); + } + } + } + + return permissionGrantInfos.Values.ToList(); + } } } \ No newline at end of file diff --git a/src/Volo.Abp.Session/Volo/Abp/Permissions/UserSettingManagerExtensions.cs b/src/Volo.Abp.Session/Volo/Abp/Permissions/UserPermissionManagerExtensions.cs similarity index 100% rename from src/Volo.Abp.Session/Volo/Abp/Permissions/UserSettingManagerExtensions.cs rename to src/Volo.Abp.Session/Volo/Abp/Permissions/UserPermissionManagerExtensions.cs diff --git a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_User_Tests.cs b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_User_Tests.cs index a7731f49dc..e8ef2efc24 100644 --- a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_User_Tests.cs +++ b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_User_Tests.cs @@ -82,7 +82,8 @@ namespace Volo.Abp.Permissions //User2 permission = await _permissionManager.GetAllForUserAsync(PermissionTestDataBuilder.User2Id); - permission.Count.ShouldBe(0); + permission.Count.ShouldBeGreaterThan(0); + permission.ShouldContain(p => p.Name == "MyPermission1" && !p.IsGranted); } [Fact] @@ -97,7 +98,8 @@ namespace Volo.Abp.Permissions //User2 _currentUserId = PermissionTestDataBuilder.User2Id; permission = await _permissionManager.GetAllForCurrentUserAsync(); - permission.Count.ShouldBe(0); + permission.Count.ShouldBeGreaterThan(0); + permission.ShouldContain(p => p.Name == "MyPermission1" && !p.IsGranted); } [Fact]