Browse Source

Optimize permission checks using IPermissionChecker

pull/24184/head
maliming 10 months ago
parent
commit
4e9322c94e
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 63
      modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs

63
modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs

@ -18,6 +18,7 @@ public class PermissionAppService : ApplicationService, IPermissionAppService
{ {
protected PermissionManagementOptions Options { get; } protected PermissionManagementOptions Options { get; }
protected IPermissionManager PermissionManager { get; } protected IPermissionManager PermissionManager { get; }
protected IPermissionChecker PermissionChecker { get; }
protected IResourcePermissionManager ResourcePermissionManager { get; } protected IResourcePermissionManager ResourcePermissionManager { get; }
protected IResourcePermissionGrantRepository ResourcePermissionGrantRepository { get; } protected IResourcePermissionGrantRepository ResourcePermissionGrantRepository { get; }
protected IPermissionDefinitionManager PermissionDefinitionManager { get; } protected IPermissionDefinitionManager PermissionDefinitionManager { get; }
@ -25,6 +26,7 @@ public class PermissionAppService : ApplicationService, IPermissionAppService
public PermissionAppService( public PermissionAppService(
IPermissionManager permissionManager, IPermissionManager permissionManager,
IPermissionChecker permissionChecker,
IPermissionDefinitionManager permissionDefinitionManager, IPermissionDefinitionManager permissionDefinitionManager,
IResourcePermissionManager resourcePermissionManager, IResourcePermissionManager resourcePermissionManager,
IResourcePermissionGrantRepository resourcePermissionGrantRepository, IResourcePermissionGrantRepository resourcePermissionGrantRepository,
@ -36,6 +38,7 @@ public class PermissionAppService : ApplicationService, IPermissionAppService
Options = options.Value; Options = options.Value;
PermissionManager = permissionManager; PermissionManager = permissionManager;
PermissionChecker = permissionChecker;
ResourcePermissionManager = resourcePermissionManager; ResourcePermissionManager = resourcePermissionManager;
ResourcePermissionGrantRepository = resourcePermissionGrantRepository; ResourcePermissionGrantRepository = resourcePermissionGrantRepository;
PermissionDefinitionManager = permissionDefinitionManager; PermissionDefinitionManager = permissionDefinitionManager;
@ -172,7 +175,7 @@ public class PermissionAppService : ApplicationService, IPermissionAppService
if (!resourcePermissions.Any() || if (!resourcePermissions.Any() ||
!await AuthorizationService.IsGrantedAnyAsync(resourcePermissions.Select(p => p.ManagementPermissionName!).ToArray())) !await AuthorizationService.IsGrantedAnyAsync(resourcePermissions.Select(p => p.ManagementPermissionName!).ToArray()))
{ {
return new GetResourceProviderListResultDto();; return new GetResourceProviderListResultDto();
} }
var lookupServices = await ResourcePermissionManager.GetProviderKeyLookupServicesAsync(); var lookupServices = await ResourcePermissionManager.GetProviderKeyLookupServicesAsync();
@ -215,16 +218,22 @@ public class PermissionAppService : ApplicationService, IPermissionAppService
}; };
var resourcePermissions = await ResourcePermissionManager.GetAvailablePermissionsAsync(resourceName); var resourcePermissions = await ResourcePermissionManager.GetAvailablePermissionsAsync(resourceName);
var permissionGrants = (await PermissionChecker.IsGrantedAsync(resourcePermissions
.Select(rp => rp.ManagementPermissionName!)
.Distinct().ToArray())).Result.Where(x => x.Value == PermissionGrantResult.Granted).Select(x => x.Key)
.ToHashSet();
foreach (var resourcePermission in resourcePermissions) foreach (var resourcePermission in resourcePermissions)
{ {
if (await AuthorizationService.IsGrantedAsync(resourcePermission.ManagementPermissionName!)) if (!permissionGrants.Contains(resourcePermission.ManagementPermissionName))
{ {
result.Permissions.Add(new ResourcePermissionDefinitionDto continue;
{
Name = resourcePermission.Name,
DisplayName = resourcePermission.DisplayName?.Localize(StringLocalizerFactory),
});
} }
result.Permissions.Add(new ResourcePermissionDefinitionDto
{
Name = resourcePermission.Name,
DisplayName = resourcePermission.DisplayName?.Localize(StringLocalizerFactory),
});
} }
return result; return result;
@ -239,6 +248,10 @@ public class PermissionAppService : ApplicationService, IPermissionAppService
var resourcePermissions = await ResourcePermissionManager.GetAvailablePermissionsAsync(resourceName); var resourcePermissions = await ResourcePermissionManager.GetAvailablePermissionsAsync(resourceName);
var resourcePermissionGrants = await ResourcePermissionManager.GetAllGroupAsync(resourceName, resourceKey); var resourcePermissionGrants = await ResourcePermissionManager.GetAllGroupAsync(resourceName, resourceKey);
var permissionGrants = (await PermissionChecker.IsGrantedAsync(resourcePermissions
.Select(rp => rp.ManagementPermissionName!)
.Distinct().ToArray())).Result.Where(x => x.Value == PermissionGrantResult.Granted).Select(x => x.Key)
.ToHashSet();
foreach (var resourcePermissionGrant in resourcePermissionGrants) foreach (var resourcePermissionGrant in resourcePermissionGrants)
{ {
var resourcePermissionGrantInfoDto = new ResourcePermissionGrantInfoDto var resourcePermissionGrantInfoDto = new ResourcePermissionGrantInfoDto
@ -248,7 +261,6 @@ public class PermissionAppService : ApplicationService, IPermissionAppService
ProviderDisplayName = resourcePermissionGrant.ProviderDisplayName, ProviderDisplayName = resourcePermissionGrant.ProviderDisplayName,
Permissions = new List<GrantedResourcePermissionDto>() Permissions = new List<GrantedResourcePermissionDto>()
}; };
foreach (var permission in resourcePermissionGrant.Permissions) foreach (var permission in resourcePermissionGrant.Permissions)
{ {
var resourcePermission = resourcePermissions.FirstOrDefault(x => x.Name == permission); var resourcePermission = resourcePermissions.FirstOrDefault(x => x.Name == permission);
@ -257,14 +269,16 @@ public class PermissionAppService : ApplicationService, IPermissionAppService
continue; continue;
} }
if (await AuthorizationService.IsGrantedAsync(resourcePermission.ManagementPermissionName!)) if (!permissionGrants.Contains(resourcePermission.ManagementPermissionName))
{ {
resourcePermissionGrantInfoDto.Permissions.Add(new GrantedResourcePermissionDto() continue;
{
Name = permission,
DisplayName = resourcePermission?.DisplayName.Localize(StringLocalizerFactory),
});
} }
resourcePermissionGrantInfoDto.Permissions.Add(new GrantedResourcePermissionDto()
{
Name = permission,
DisplayName = resourcePermission?.DisplayName.Localize(StringLocalizerFactory),
});
} }
if(resourcePermissionGrantInfoDto.Permissions.Any()) if(resourcePermissionGrantInfoDto.Permissions.Any())
@ -285,6 +299,10 @@ public class PermissionAppService : ApplicationService, IPermissionAppService
var resourcePermissions = await ResourcePermissionManager.GetAvailablePermissionsAsync(resourceName); var resourcePermissions = await ResourcePermissionManager.GetAvailablePermissionsAsync(resourceName);
var resourcePermissionGrants = await ResourcePermissionManager.GetAllAsync(resourceName, resourceKey, providerName, providerKey); var resourcePermissionGrants = await ResourcePermissionManager.GetAllAsync(resourceName, resourceKey, providerName, providerKey);
var permissionGrants = (await PermissionChecker.IsGrantedAsync(resourcePermissions
.Select(rp => rp.ManagementPermissionName!)
.Distinct().ToArray())).Result.Where(x => x.Value == PermissionGrantResult.Granted).Select(x => x.Key)
.ToHashSet();
foreach (var resourcePermissionGrant in resourcePermissionGrants) foreach (var resourcePermissionGrant in resourcePermissionGrants)
{ {
var resourcePermission = resourcePermissions.FirstOrDefault(x => x.Name == resourcePermissionGrant.Name); var resourcePermission = resourcePermissions.FirstOrDefault(x => x.Name == resourcePermissionGrant.Name);
@ -293,7 +311,7 @@ public class PermissionAppService : ApplicationService, IPermissionAppService
continue; continue;
} }
if (!await AuthorizationService.IsGrantedAsync(resourcePermission.ManagementPermissionName!)) if (!permissionGrants.Contains(resourcePermission.ManagementPermissionName))
{ {
continue; continue;
} }
@ -312,14 +330,17 @@ public class PermissionAppService : ApplicationService, IPermissionAppService
public virtual async Task UpdateResourceAsync(string resourceName, string resourceKey, UpdateResourcePermissionsDto input) public virtual async Task UpdateResourceAsync(string resourceName, string resourceKey, UpdateResourcePermissionsDto input)
{ {
var resourcePermissions = await ResourcePermissionManager.GetAvailablePermissionsAsync(resourceName); var resourcePermissions = await ResourcePermissionManager.GetAvailablePermissionsAsync(resourceName);
var permissionGrants = (await PermissionChecker.IsGrantedAsync(resourcePermissions
.Select(rp => rp.ManagementPermissionName!)
.Distinct().ToArray())).Result.Where(x => x.Value == PermissionGrantResult.Granted).Select(x => x.Key)
.ToHashSet();
foreach (var resourcePermission in resourcePermissions) foreach (var resourcePermission in resourcePermissions)
{ {
if (!await AuthorizationService.IsGrantedAsync(resourcePermission.ManagementPermissionName!)) if (!permissionGrants.Contains(resourcePermission.ManagementPermissionName))
{ {
continue; continue;
} }
var isGranted = !input.Permissions.IsNullOrEmpty() && input.Permissions.Any(p => p == resourcePermission.Name); var isGranted = !input.Permissions.IsNullOrEmpty() && input.Permissions.Any(p => p == resourcePermission.Name);
await ResourcePermissionManager.SetAsync(resourcePermission.Name, resourceName, resourceKey, input.ProviderName, input.ProviderKey, isGranted); await ResourcePermissionManager.SetAsync(resourcePermission.Name, resourceName, resourceKey, input.ProviderName, input.ProviderKey, isGranted);
} }
@ -328,9 +349,13 @@ public class PermissionAppService : ApplicationService, IPermissionAppService
public virtual async Task DeleteResourceAsync(string resourceName, string resourceKey, string providerName, string providerKey) public virtual async Task DeleteResourceAsync(string resourceName, string resourceKey, string providerName, string providerKey)
{ {
var resourcePermissions = await ResourcePermissionManager.GetAvailablePermissionsAsync(resourceName); var resourcePermissions = await ResourcePermissionManager.GetAvailablePermissionsAsync(resourceName);
var permissionGrants = (await PermissionChecker.IsGrantedAsync(resourcePermissions
.Select(rp => rp.ManagementPermissionName!)
.Distinct().ToArray())).Result.Where(x => x.Value == PermissionGrantResult.Granted).Select(x => x.Key)
.ToHashSet();
foreach (var resourcePermission in resourcePermissions) foreach (var resourcePermission in resourcePermissions)
{ {
if (!await AuthorizationService.IsGrantedAsync(resourcePermission.ManagementPermissionName!)) if (!permissionGrants.Contains(resourcePermission.ManagementPermissionName))
{ {
continue; continue;
} }

Loading…
Cancel
Save