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. 86
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IdentityPermissions.cs
  2. 40
      aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Domain.OrganizationUnits/LINGYUN/Abp/PermissionManagement/OrganizationUnits/AbpPermissionManagementDomainOrganizationUnitsModule.cs
  3. 29
      aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Domain.OrganizationUnits/LINGYUN/Abp/PermissionManagement/OrganizationUnits/OrganizationUnitPermissionManagementProvider.cs

86
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Application.Contracts/LINGYUN/Abp/Identity/IdentityPermissions.cs

@ -1,44 +1,44 @@
using Volo.Abp.Reflection; using Volo.Abp.Reflection;
namespace LINGYUN.Abp.Identity namespace LINGYUN.Abp.Identity
{ {
public class IdentityPermissions public class IdentityPermissions
{ {
public static class Roles public static class Roles
{ {
public const string ManageClaims = Volo.Abp.Identity.IdentityPermissions.Roles.Default + ".ManageClaims"; public const string ManageClaims = Volo.Abp.Identity.IdentityPermissions.Roles.Default + ".ManageClaims";
public const string ManageOrganizationUnits = Volo.Abp.Identity.IdentityPermissions.Roles.Default + ".ManageOrganizationUnits"; public const string ManageOrganizationUnits = Volo.Abp.Identity.IdentityPermissions.Roles.Default + ".ManageOrganizationUnits";
} }
public static class Users public static class Users
{ {
public const string ResetPassword = Volo.Abp.Identity.IdentityPermissions.Users.Default + ".ResetPassword"; public const string ResetPassword = Volo.Abp.Identity.IdentityPermissions.Users.Default + ".ResetPassword";
public const string ManageClaims = Volo.Abp.Identity.IdentityPermissions.Users.Default + ".ManageClaims"; public const string ManageClaims = Volo.Abp.Identity.IdentityPermissions.Users.Default + ".ManageClaims";
public const string ManageOrganizationUnits = Volo.Abp.Identity.IdentityPermissions.Users.Default + ".ManageOrganizationUnits"; public const string ManageOrganizationUnits = Volo.Abp.Identity.IdentityPermissions.Users.Default + ".ManageOrganizationUnits";
} }
public static class OrganizationUnits public static class OrganizationUnits
{ {
public const string Default = Volo.Abp.Identity.IdentityPermissions.GroupName + ".OrganizationUnits"; public const string Default = Volo.Abp.Identity.IdentityPermissions.GroupName + ".OrganizationUnits";
public const string Create = Default + ".Create"; public const string Create = Default + ".Create";
public const string Update = Default + ".Update"; public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete"; public const string Delete = Default + ".Delete";
public const string ManageUsers = Default + ".ManageUsers"; public const string ManageUsers = Default + ".ManageUsers";
public const string ManageRoles = Default + ".ManageRoles"; public const string ManageRoles = Default + ".ManageRoles";
public const string ManagePermissions = Default + ".ManagePermissions"; public const string ManagePermissions = Default + ".ManagePermissions";
} }
public static class IdentityClaimType public static class IdentityClaimType
{ {
public const string Default = Volo.Abp.Identity.IdentityPermissions.GroupName + ".IdentityClaimTypes"; public const string Default = Volo.Abp.Identity.IdentityPermissions.GroupName + ".IdentityClaimTypes";
public const string Create = Default + ".Create"; public const string Create = Default + ".Create";
public const string Update = Default + ".Update"; public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete"; public const string Delete = Default + ".Delete";
} }
public static string[] GetAll() public static string[] GetAll()
{ {
return ReflectionHelper.GetPublicConstantsRecursively(typeof(IdentityPermissions)); return ReflectionHelper.GetPublicConstantsRecursively(typeof(IdentityPermissions));
} }
} }
} }

40
aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Domain.OrganizationUnits/LINGYUN/Abp/PermissionManagement/OrganizationUnits/AbpPermissionManagementDomainOrganizationUnitsModule.cs

@ -1,25 +1,25 @@
using LINGYUN.Abp.Authorization.OrganizationUnits; using LINGYUN.Abp.Authorization.OrganizationUnits;
using LINGYUN.Abp.Authorization.Permissions; using LINGYUN.Abp.Authorization.Permissions;
using LINGYUN.Abp.Identity; using LINGYUN.Abp.Identity;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement; using Volo.Abp.PermissionManagement;
namespace LINGYUN.Abp.PermissionManagement.OrganizationUnits; namespace LINGYUN.Abp.PermissionManagement.OrganizationUnits;
[DependsOn( [DependsOn(
typeof(AbpIdentityDomainModule), typeof(AbpIdentityDomainModule),
typeof(AbpPermissionManagementDomainModule), typeof(AbpPermissionManagementDomainModule),
typeof(AbpAuthorizationOrganizationUnitsModule) typeof(AbpAuthorizationOrganizationUnitsModule)
)] )]
public class AbpPermissionManagementDomainOrganizationUnitsModule : AbpModule public class AbpPermissionManagementDomainOrganizationUnitsModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
Configure<PermissionManagementOptions>(options => Configure<PermissionManagementOptions>(options =>
{ {
options.ManagementProviders.Add<OrganizationUnitPermissionManagementProvider>(); options.ManagementProviders.Add<OrganizationUnitPermissionManagementProvider>();
options.ProviderPolicies[OrganizationUnitPermissionValueProvider.ProviderName] = "AbpIdentity.OrganizationUnits.ManagePermissions"; options.ProviderPolicies[OrganizationUnitPermissionValueProvider.ProviderName] = "AbpIdentity.OrganizationUnits.ManagePermissions";
}); });
} }
} }

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