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 b51110204a..e97d524cd7 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 @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Domain.Repositories; using Volo.Abp.Guids; using Volo.Abp.Identity; using Volo.Abp.MultiTenancy; @@ -37,41 +38,44 @@ public class RolePermissionManagementProvider : PermissionManagementProvider public async override Task CheckAsync(string[] names, string providerName, string providerKey) { - var multiplePermissionValueProviderGrantInfo = new MultiplePermissionValueProviderGrantInfo(names); - var permissionGrants = new List(); - - if (providerName == Name) + using (PermissionGrantRepository.DisableTracking()) { - permissionGrants.AddRange(await PermissionGrantRepository.GetListAsync(names, providerName, providerKey)); + var multiplePermissionValueProviderGrantInfo = new MultiplePermissionValueProviderGrantInfo(names); + var permissionGrants = new List(); - } + if (providerName == Name) + { + permissionGrants.AddRange(await PermissionGrantRepository.GetListAsync(names, providerName, providerKey)); - if (providerName == UserPermissionValueProvider.ProviderName) - { - var userId = Guid.Parse(providerKey); - var roleNames = await UserRoleFinder.GetRoleNamesAsync(userId); + } - foreach (var roleName in roleNames) + if (providerName == UserPermissionValueProvider.ProviderName) { - permissionGrants.AddRange(await PermissionGrantRepository.GetListAsync(names, Name, roleName)); + var userId = Guid.Parse(providerKey); + var roleNames = await UserRoleFinder.GetRoleNamesAsync(userId); + + foreach (var roleName in roleNames) + { + permissionGrants.AddRange(await PermissionGrantRepository.GetListAsync(names, Name, roleName)); + } } - } - permissionGrants = permissionGrants.Distinct().ToList(); - if (!permissionGrants.Any()) - { - return multiplePermissionValueProviderGrantInfo; - } + permissionGrants = permissionGrants.Distinct().ToList(); + if (!permissionGrants.Any()) + { + return multiplePermissionValueProviderGrantInfo; + } - foreach (var permissionName in names) - { - var permissionGrant = permissionGrants.FirstOrDefault(x => x.Name == permissionName); - if (permissionGrant != null) + foreach (var permissionName in names) { - multiplePermissionValueProviderGrantInfo.Result[permissionName] = new PermissionValueProviderGrantInfo(true, permissionGrant.ProviderKey); + var permissionGrant = permissionGrants.FirstOrDefault(x => x.Name == permissionName); + if (permissionGrant != null) + { + multiplePermissionValueProviderGrantInfo.Result[permissionName] = new PermissionValueProviderGrantInfo(true, permissionGrant.ProviderKey); + } } - } - return multiplePermissionValueProviderGrantInfo; + 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 ef056918c8..0b7b61c326 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 @@ -43,72 +43,62 @@ public class PermissionAppService : ApplicationService, IPermissionAppService }; var multiTenancySide = CurrentTenant.GetMultiTenancySide(); + var permissionGroups = new List(); foreach (var group in await PermissionDefinitionManager.GetGroupsAsync()) { var groupDto = CreatePermissionGroupDto(group); + var permissions = group.GetPermissionsWithChildren() + .Where(x => x.IsEnabled && + (!x.Providers.Any() || x.Providers.Contains(providerName)) && + x.MultiTenancySide.HasFlag(multiTenancySide)); var neededCheckPermissions = new List(); - - var permissions = group.GetPermissionsWithChildren() - .Where(x => x.IsEnabled) - .Where(x => !x.Providers.Any() || x.Providers.Contains(providerName)) - .Where(x => x.MultiTenancySide.HasFlag(multiTenancySide)); - foreach (var permission in permissions) { - if(permission.Parent != null && !neededCheckPermissions.Contains(permission.Parent)) + if (permission.Parent != null && !neededCheckPermissions.Contains(permission.Parent)) { continue; } - + if (await SimpleStateCheckerManager.IsEnabledAsync(permission)) { neededCheckPermissions.Add(permission); } } - if (!neededCheckPermissions.Any()) - { - continue; - } - - var grantInfoDtos = neededCheckPermissions - .Select(CreatePermissionGrantInfoDto) - .ToList(); + groupDto.Permissions.AddRange(neededCheckPermissions.Select(CreatePermissionGrantInfoDto)); + permissionGroups.Add(groupDto); + } - var multipleGrantInfo = await PermissionManager.GetAsync(neededCheckPermissions.Select(x => x.Name).ToArray(), providerName, providerKey); + var multipleGrantInfo = await PermissionManager.GetAsync( + permissionGroups.SelectMany(group => group.Permissions).Select(permission => permission.Name).ToArray(), + providerName, + providerKey); - foreach (var grantInfo in multipleGrantInfo.Result) + foreach (var permissionGroup in permissionGroups) + { + foreach (var permission in permissionGroup.Permissions.Where(x => multipleGrantInfo.Result.Any(y => y.Name == x.Name))) { - var grantInfoDto = grantInfoDtos.First(x => x.Name == grantInfo.Name); - - grantInfoDto.IsGranted = grantInfo.IsGranted; - - foreach (var provider in grantInfo.Providers) + var grantInfo = multipleGrantInfo.Result.First(x => x.Name == permission.Name); + permission.IsGranted = grantInfo.IsGranted; + permission.GrantedProviders = grantInfo.Providers.Select(x => new ProviderInfoDto { - grantInfoDto.GrantedProviders.Add(new ProviderInfoDto - { - ProviderName = provider.Name, - ProviderKey = provider.Key, - }); - } - - groupDto.Permissions.Add(grantInfoDto); + ProviderName = x.Name, + ProviderKey = x.Key, + }).ToList(); } - if (groupDto.Permissions.Any()) - { - result.Groups.Add(groupDto); - } + result.Groups.Add(permissionGroup); } return result; } - private PermissionGrantInfoDto CreatePermissionGrantInfoDto(PermissionDefinition permission) + protected virtual PermissionGrantInfoDto CreatePermissionGrantInfoDto(PermissionDefinition permission) { - return new PermissionGrantInfoDto { + return new PermissionGrantInfoDto + { Name = permission.Name, DisplayName = permission.DisplayName?.Localize(StringLocalizerFactory), ParentName = permission.Parent?.Name, @@ -117,10 +107,10 @@ public class PermissionAppService : ApplicationService, IPermissionAppService }; } - private PermissionGroupDto CreatePermissionGroupDto(PermissionGroupDefinition group) + protected virtual PermissionGroupDto CreatePermissionGroupDto(PermissionGroupDefinition group) { var localizableDisplayName = group.DisplayName as LocalizableString; - + return new PermissionGroupDto { Name = group.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 0a80ed53e5..b6dfc2e518 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,5 +1,6 @@ using System.Linq; using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; using Volo.Abp.Guids; using Volo.Abp.MultiTenancy; @@ -34,21 +35,24 @@ public abstract class PermissionManagementProvider : IPermissionManagementProvid public virtual async Task CheckAsync(string[] names, string providerName, string providerKey) { - var multiplePermissionValueProviderGrantInfo = new MultiplePermissionValueProviderGrantInfo(names); - if (providerName != Name) + using (PermissionGrantRepository.DisableTracking()) { - return multiplePermissionValueProviderGrantInfo; - } + var multiplePermissionValueProviderGrantInfo = new MultiplePermissionValueProviderGrantInfo(names); + if (providerName != Name) + { + return multiplePermissionValueProviderGrantInfo; + } - var permissionGrants = await PermissionGrantRepository.GetListAsync(names, providerName, providerKey); + var permissionGrants = await PermissionGrantRepository.GetListAsync(names, providerName, providerKey); - foreach (var permissionName in names) - { - var isGrant = permissionGrants.Any(x => x.Name == permissionName); - multiplePermissionValueProviderGrantInfo.Result[permissionName] = new PermissionValueProviderGrantInfo(isGrant, providerKey); - } + foreach (var permissionName in names) + { + var isGrant = permissionGrants.Any(x => x.Name == permissionName); + multiplePermissionValueProviderGrantInfo.Result[permissionName] = new PermissionValueProviderGrantInfo(isGrant, providerKey); + } - return multiplePermissionValueProviderGrantInfo; + return multiplePermissionValueProviderGrantInfo; + } } public virtual Task SetAsync(string name, string providerKey, bool isGranted)