Browse Source

Add resource permission management features and update API methods

pull/24374/head
maliming 9 months ago
parent
commit
b3706cf23a
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 11
      modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/AbpPermissionManagementDomainIdentityModule.cs
  2. 10
      modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/GetResourcePermissionListResultDto.cs
  3. 4
      modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/IPermissionAppService.cs
  4. 16
      modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/ResourcePermissionGrantInfoDto.cs
  5. 68
      modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs
  6. 8
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementOptions.cs
  7. 12
      modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo/Abp/PermissionManagement/PermissionsController.cs

11
modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/AbpPermissionManagementDomainIdentityModule.cs

@ -19,14 +19,17 @@ public class AbpPermissionManagementDomainIdentityModule : AbpModule
{
options.ManagementProviders.Add<UserPermissionManagementProvider>();
options.ManagementProviders.Add<RolePermissionManagementProvider>();
options.ResourceManagementProviders.Add<UserResourcePermissionManagementProvider>();
options.ResourceManagementProviders.Add<RoleResourcePermissionManagementProvider>();
//TODO: Can we prevent duplication of permission names without breaking the design and making the system complicated
options.ProviderPolicies[UserPermissionValueProvider.ProviderName] = "AbpIdentity.Users.ManagePermissions";
options.ProviderPolicies[RolePermissionValueProvider.ProviderName] = "AbpIdentity.Roles.ManagePermissions";
options.ProviderPolicies[UserResourcePermissionValueProvider.ProviderName] = "AbpIdentity.Users.ManagePermissions";
options.ProviderPolicies[RoleResourcePermissionValueProvider.ProviderName] = "AbpIdentity.Roles.ManagePermissions";
options.ResourceManagementProviders.Add<UserResourcePermissionManagementProvider>();
options.ResourceManagementProviders.Add<RoleResourcePermissionManagementProvider>();
//TODO: Can we prevent duplication of permission names without breaking the design and making the system complicated
options.ResourceProviderPolicies[UserResourcePermissionValueProvider.ProviderName] = "AbpIdentity.Users.ManagePermissions";
options.ResourceProviderPolicies[RoleResourcePermissionValueProvider.ProviderName] = "AbpIdentity.Roles.ManagePermissions";
});
}
}

10
modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/GetResourcePermissionListResultDto.cs

@ -0,0 +1,10 @@
using System.Collections.Generic;
namespace Volo.Abp.PermissionManagement;
public class GetResourcePermissionListResultDto
{
public string EntityDisplayName { get; set; }
public List<ResourcePermissionGrantInfoDto> Permissions { get; set; }
}

4
modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/IPermissionAppService.cs

@ -11,4 +11,8 @@ public interface IPermissionAppService : IApplicationService
Task<GetPermissionListResultDto> GetByGroupAsync([NotNull] string groupName, [NotNull] string providerName, [NotNull] string providerKey);
Task UpdateAsync([NotNull] string providerName, [NotNull] string providerKey, UpdatePermissionsDto input);
Task<GetResourcePermissionListResultDto> GetAsync([NotNull] string resourceName, [NotNull] string resourceKey, [NotNull] string providerName, [NotNull] string providerKey);
Task UpdateAsync([NotNull] string resourceName, [NotNull] string resourceKey, [NotNull] string providerName, [NotNull] string providerKey, UpdatePermissionsDto input);
}

16
modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/ResourcePermissionGrantInfoDto.cs

@ -0,0 +1,16 @@
using System.Collections.Generic;
namespace Volo.Abp.PermissionManagement;
public class ResourcePermissionGrantInfoDto
{
public string Name { get; set; }
public string DisplayName { get; set; }
public bool IsGranted { get; set; }
public List<string> AllowedProviders { get; set; }
public List<ProviderInfoDto> GrantedProviders { get; set; }
}

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

@ -18,12 +18,14 @@ public class PermissionAppService : ApplicationService, IPermissionAppService
{
protected PermissionManagementOptions Options { get; }
protected IPermissionManager PermissionManager { get; }
protected IResourcePermissionManager ResourcePermissionManager { get; }
protected IPermissionDefinitionManager PermissionDefinitionManager { get; }
protected ISimpleStateCheckerManager<PermissionDefinition> SimpleStateCheckerManager { get; }
public PermissionAppService(
IPermissionManager permissionManager,
IPermissionDefinitionManager permissionDefinitionManager,
IResourcePermissionManager resourcePermissionManager,
IOptions<PermissionManagementOptions> options,
ISimpleStateCheckerManager<PermissionDefinition> simpleStateCheckerManager)
{
@ -32,6 +34,7 @@ public class PermissionAppService : ApplicationService, IPermissionAppService
Options = options.Value;
PermissionManager = permissionManager;
ResourcePermissionManager = resourcePermissionManager;
PermissionDefinitionManager = permissionDefinitionManager;
SimpleStateCheckerManager = simpleStateCheckerManager;
}
@ -160,14 +163,73 @@ public class PermissionAppService : ApplicationService, IPermissionAppService
}
}
protected virtual async Task CheckProviderPolicy(string providerName)
public virtual async Task<GetResourcePermissionListResultDto> GetAsync(string resourceName, string resourceKey, string providerName, string providerKey)
{
var policyName = Options.ProviderPolicies.GetOrDefault(providerName);
await CheckProviderPolicy(providerName, true);
var result = new GetResourcePermissionListResultDto
{
EntityDisplayName = providerKey,
Permissions = new List<ResourcePermissionGrantInfoDto>()
};
var multiTenancySide = CurrentTenant.GetMultiTenancySide();
var resourcePermissions = new List<PermissionDefinition>();
foreach (var resourcePermission in (await PermissionDefinitionManager.GetResourcePermissionsAsync())
.Where(x => x.IsEnabled && (!x.Providers.Any() || x.Providers.Contains(providerName)) && x.MultiTenancySide.HasFlag(multiTenancySide)))
{
if (await SimpleStateCheckerManager.IsEnabledAsync(resourcePermission))
{
resourcePermissions.Add(resourcePermission);
}
}
var multipleGrantInfo = await ResourcePermissionManager.GetAsync(resourcePermissions.Select(x => x.Name).ToArray(), resourceName, resourceKey, providerName, providerKey);
foreach (var resourcePermission in resourcePermissions)
{
var grantInfo = multipleGrantInfo.Result.FirstOrDefault(x => x.Name == resourcePermission.Name);
if (grantInfo == null)
{
continue;
}
result.Permissions.Add(new ResourcePermissionGrantInfoDto()
{
Name = resourcePermission.Name,
DisplayName = resourcePermission.DisplayName?.Localize(StringLocalizerFactory),
IsGranted = grantInfo.IsGranted,
AllowedProviders = resourcePermission.Providers,
GrantedProviders = grantInfo.Providers.Select(x => new ProviderInfoDto
{
ProviderName = x.Name,
ProviderKey = x.Key,
}).ToList()
});
}
return result;
}
public virtual async Task UpdateAsync(string resourceName, string resourceKey, string providerName, string providerKey, UpdatePermissionsDto input)
{
await CheckProviderPolicy(providerName, true);
foreach (var permissionDto in input.Permissions)
{
await ResourcePermissionManager.SetAsync(permissionDto.Name, resourceName, resourceKey, providerName, providerKey, permissionDto.IsGranted);
}
}
protected virtual async Task CheckProviderPolicy(string providerName, bool isResourcePermission = false)
{
var policyName = isResourcePermission
? Options.ResourceProviderPolicies.GetOrDefault(providerName)
: Options.ProviderPolicies.GetOrDefault(providerName);
if (policyName.IsNullOrEmpty())
{
throw new AbpException($"No policy defined to get/set permissions for the provider '{providerName}'. Use {nameof(PermissionManagementOptions)} to map the policy.");
}
await AuthorizationService.CheckAsync(policyName);
}
}

8
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementOptions.cs

@ -7,9 +7,11 @@ public class PermissionManagementOptions
{
public ITypeList<IPermissionManagementProvider> ManagementProviders { get; }
public Dictionary<string, string> ProviderPolicies { get; }
public ITypeList<IResourcePermissionManagementProvider> ResourceManagementProviders { get; }
public Dictionary<string, string> ProviderPolicies { get; }
public Dictionary<string, string> ResourceProviderPolicies { get; }
/// <summary>
/// Default: true.
@ -24,7 +26,9 @@ public class PermissionManagementOptions
public PermissionManagementOptions()
{
ManagementProviders = new TypeList<IPermissionManagementProvider>();
ResourceManagementProviders = new TypeList<IResourcePermissionManagementProvider>();
ProviderPolicies = new Dictionary<string, string>();
ResourceManagementProviders = new TypeList<IResourcePermissionManagementProvider>();
ResourceProviderPolicies = new Dictionary<string, string>();
}
}

12
modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo/Abp/PermissionManagement/PermissionsController.cs

@ -34,4 +34,16 @@ public class PermissionsController : AbpControllerBase, IPermissionAppService
{
return PermissionAppService.UpdateAsync(providerName, providerKey, input);
}
[HttpGet("resource")]
public virtual Task<GetResourcePermissionListResultDto> GetAsync(string resourceName, string resourceKey, string providerName, string providerKey)
{
return PermissionAppService.GetAsync(resourceName, resourceKey, providerName, providerKey);
}
[HttpPut("resource")]
public virtual Task UpdateAsync(string resourceName, string resourceKey, string providerName, string providerKey, UpdatePermissionsDto input)
{
return PermissionAppService.UpdateAsync(resourceName, resourceKey, providerName, providerKey, input);
}
}

Loading…
Cancel
Save