Browse Source

Merge pull request #939 from colinin/perf-organization-permissions

perf(permissions): organization permission efficiency.
pull/955/head
yx lin 2 years ago
committed by GitHub
parent
commit
8eee5e5ee2
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 29
      aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Domain.OrganizationUnits/LINGYUN/Abp/PermissionManagement/OrganizationUnits/OrganizationUnitPermissionManagementProvider.cs

29
aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Domain.OrganizationUnits/LINGYUN/Abp/PermissionManagement/OrganizationUnits/OrganizationUnitPermissionManagementProvider.cs

@ -5,7 +5,9 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Guids; using Volo.Abp.Guids;
using Volo.Abp.Linq;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
using Volo.Abp.PermissionManagement; using Volo.Abp.PermissionManagement;
using UserManager = Volo.Abp.Identity.IdentityUserManager; using UserManager = Volo.Abp.Identity.IdentityUserManager;
@ -16,10 +18,14 @@ public class OrganizationUnitPermissionManagementProvider : PermissionManagement
public override string Name => OrganizationUnitPermissionValueProvider.ProviderName; public override string Name => OrganizationUnitPermissionValueProvider.ProviderName;
protected UserManager UserManager { get; } protected UserManager UserManager { get; }
protected IAsyncQueryableExecuter AsyncQueryableExecuter { get; }
protected IIdentityUserRepository IdentityUserRepository { get; } protected IIdentityUserRepository IdentityUserRepository { get; }
protected IIdentityRoleRepository IdentityRoleRepository { get; } protected IIdentityRoleRepository IdentityRoleRepository { get; }
protected IRepository<PermissionGrant, Guid> PermissionGrantBasicRepository { get; }
public OrganizationUnitPermissionManagementProvider( public OrganizationUnitPermissionManagementProvider(
IAsyncQueryableExecuter asyncQueryableExecuter,
IRepository<PermissionGrant, Guid> permissionGrantBasicRepository,
IPermissionGrantRepository permissionGrantRepository, IPermissionGrantRepository permissionGrantRepository,
IIdentityUserRepository identityUserRepository, IIdentityUserRepository identityUserRepository,
IIdentityRoleRepository identityRoleRepository, IIdentityRoleRepository identityRoleRepository,
@ -32,8 +38,10 @@ public class OrganizationUnitPermissionManagementProvider : PermissionManagement
currentTenant) currentTenant)
{ {
UserManager = userManager; UserManager = userManager;
AsyncQueryableExecuter = asyncQueryableExecuter;
IdentityUserRepository = identityUserRepository; IdentityUserRepository = identityUserRepository;
IdentityRoleRepository = identityRoleRepository; IdentityRoleRepository = identityRoleRepository;
PermissionGrantBasicRepository = permissionGrantBasicRepository;
} }
public override async Task<PermissionValueProviderGrantInfo> CheckAsync(string name, string providerName, string providerKey) public override async Task<PermissionValueProviderGrantInfo> CheckAsync(string name, string providerName, string providerKey)
@ -51,29 +59,32 @@ public class OrganizationUnitPermissionManagementProvider : PermissionManagement
if (providerName == Name) if (providerName == Name)
{ {
permissionGrants.AddRange(await PermissionGrantRepository.GetListAsync(names, providerName, providerKey)); permissionGrants.AddRange(await PermissionGrantRepository.GetListAsync(names, providerName, providerKey));
} }
if (providerName == RolePermissionValueProvider.ProviderName) if (providerName == RolePermissionValueProvider.ProviderName)
{ {
var role = await IdentityRoleRepository.FindByNormalizedNameAsync(UserManager.NormalizeName(providerKey)); var role = await IdentityRoleRepository.FindByNormalizedNameAsync(UserManager.NormalizeName(providerKey));
var organizationUnits = await IdentityRoleRepository.GetOrganizationUnitsAsync(role.Id); var organizationUnits = await IdentityRoleRepository.GetOrganizationUnitsAsync(role.Id);
var roleOrganizationUnits = organizationUnits.Select(x => x.Id.ToString());
foreach (var organizationUnit in organizationUnits) var quaryble = await PermissionGrantBasicRepository.GetQueryableAsync();
{ quaryble = quaryble.Where(x => x.ProviderName == Name && roleOrganizationUnits.Contains(x.ProviderKey) && names.Contains(x.Name));
permissionGrants.AddRange(await PermissionGrantRepository.GetListAsync(names, Name, organizationUnit.Id.ToString())); var roleUnitGrants = await AsyncQueryableExecuter.ToListAsync(quaryble);
}
permissionGrants.AddRange(roleUnitGrants);
} }
if (providerName == UserPermissionValueProvider.ProviderName) if (providerName == UserPermissionValueProvider.ProviderName)
{ {
var userId = Guid.Parse(providerKey); var userId = Guid.Parse(providerKey);
var organizationUnits = await IdentityUserRepository.GetOrganizationUnitsAsync(id: userId); var organizationUnits = await IdentityUserRepository.GetOrganizationUnitsAsync(id: userId);
var userOrganizationUnits = organizationUnits.Select(x => x.Id.ToString());
foreach (var organizationUnit in organizationUnits) var quaryble = await PermissionGrantBasicRepository.GetQueryableAsync();
{ quaryble = quaryble.Where(x => x.ProviderName == Name && userOrganizationUnits.Contains(x.ProviderKey) && names.Contains(x.Name));
permissionGrants.AddRange(await PermissionGrantRepository.GetListAsync(names, Name, organizationUnit.Id.ToString())); var userOrganizationUnitGrants = await AsyncQueryableExecuter.ToListAsync(quaryble);
}
permissionGrants.AddRange(userOrganizationUnitGrants);
} }
permissionGrants = permissionGrants.Distinct().ToList(); permissionGrants = permissionGrants.Distinct().ToList();

Loading…
Cancel
Save