Browse Source

Optimize the database queries for permission checks.

pull/22214/head
maliming 12 months ago
parent
commit
27bcb83b04
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 54
      modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs
  2. 68
      modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs
  3. 26
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs

54
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<MultiplePermissionValueProviderGrantInfo> CheckAsync(string[] names, string providerName, string providerKey)
{
var multiplePermissionValueProviderGrantInfo = new MultiplePermissionValueProviderGrantInfo(names);
var permissionGrants = new List<PermissionGrant>();
if (providerName == Name)
using (PermissionGrantRepository.DisableTracking())
{
permissionGrants.AddRange(await PermissionGrantRepository.GetListAsync(names, providerName, providerKey));
var multiplePermissionValueProviderGrantInfo = new MultiplePermissionValueProviderGrantInfo(names);
var permissionGrants = new List<PermissionGrant>();
}
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;
}
}
}

68
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<PermissionGroupDto>();
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<PermissionDefinition>();
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,

26
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<MultiplePermissionValueProviderGrantInfo> 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)

Loading…
Cancel
Save