Browse Source

feat: Exclude unavailable providers from resource permission grants and add related tests

pull/24951/head
maliming 7 months ago
parent
commit
5968b9e57f
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 47
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/ResourcePermissionManager.cs
  2. 80
      modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/ResourcePermissionManager_Tests.cs

47
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/ResourcePermissionManager.cs

@ -175,13 +175,15 @@ public class ResourcePermissionManager : IResourcePermissionManager, ISingletonD
{
var resourcePermissionDefinitions = await GetAvailablePermissionsAsync(resourceName);
var resourcePermissionGrants = await ResourcePermissionGrantRepository.GetPermissionsAsync(resourceName, resourceKey);
var unavailableProviderNames = await GetUnavailableManagementProviderNamesAsync();
var result = new List<PermissionWithGrantedProviders>();
foreach (var resourcePermissionDefinition in resourcePermissionDefinitions)
{
var permissionWithGrantedProviders = new PermissionWithGrantedProviders(resourcePermissionDefinition.Name, false);
var grantedPermissions = resourcePermissionGrants
.Where(x => x.Name == resourcePermissionDefinition.Name && x.ResourceName == resourceName && x.ResourceKey == resourceKey)
.Where(x => x.Name == resourcePermissionDefinition.Name && x.ResourceName == resourceName && x.ResourceKey == resourceKey
&& !unavailableProviderNames.Contains(x.ProviderName))
.ToList();
if (grantedPermissions.Any())
@ -210,7 +212,10 @@ public class ResourcePermissionManager : IResourcePermissionManager, ISingletonD
{
var resourcePermissions = await GetAvailablePermissionsAsync(resourceName);
var resourcePermissionGrants = await ResourcePermissionGrantRepository.GetPermissionsAsync(resourceName, resourceKey);
resourcePermissionGrants = resourcePermissionGrants.Where(x => resourcePermissions.Any(rp => rp.Name == x.Name)).ToList();
var unavailableProviderNames = await GetUnavailableManagementProviderNamesAsync();
resourcePermissionGrants = resourcePermissionGrants
.Where(x => resourcePermissions.Any(rp => rp.Name == x.Name) && !unavailableProviderNames.Contains(x.ProviderName))
.ToList();
var resourcePermissionGrantsGroup = resourcePermissionGrants.GroupBy(x => new { x.ProviderName, x.ProviderKey });
var result = new List<PermissionProviderWithPermissions>();
foreach (var resourcePermissionGrant in resourcePermissionGrantsGroup)
@ -349,6 +354,12 @@ public class ResourcePermissionManager : IResourcePermissionManager, ISingletonD
public virtual async Task DeleteAsync(string resourceName, string resourceKey, string providerName, string providerKey)
{
var provider = ManagementProviders.FirstOrDefault(m => m.Name == providerName);
if (provider != null && !await provider.IsAvailableAsync())
{
throw new AbpException($"The resource permission management provider '{providerName}' is not available in the current context.");
}
var permissionGrants = await ResourcePermissionGrantRepository.GetListAsync(resourceName, resourceKey, providerName, providerKey);
foreach (var permissionGrant in permissionGrants)
{
@ -358,6 +369,12 @@ public class ResourcePermissionManager : IResourcePermissionManager, ISingletonD
public virtual async Task DeleteAsync(string name, string resourceName, string resourceKey, string providerName, string providerKey)
{
var provider = ManagementProviders.FirstOrDefault(m => m.Name == providerName);
if (provider != null && !await provider.IsAvailableAsync())
{
throw new AbpException($"The resource permission management provider '{providerName}' is not available in the current context.");
}
var permissionGrant = await ResourcePermissionGrantRepository.FindAsync(name, resourceName, resourceKey, providerName, providerKey);
if (permissionGrant != null)
{
@ -429,4 +446,30 @@ public class ResourcePermissionManager : IResourcePermissionManager, ISingletonD
return multiplePermissionWithGrantedProviders;
}
protected virtual async Task<HashSet<string>> GetAvailableManagementProviderNamesAsync()
{
var names = new HashSet<string>();
foreach (var provider in ManagementProviders)
{
if (await provider.IsAvailableAsync())
{
names.Add(provider.Name);
}
}
return names;
}
protected virtual async Task<HashSet<string>> GetUnavailableManagementProviderNamesAsync()
{
var names = new HashSet<string>();
foreach (var provider in ManagementProviders)
{
if (!await provider.IsAvailableAsync())
{
names.Add(provider.Name);
}
}
return names;
}
}

80
modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/ResourcePermissionManager_Tests.cs

@ -391,4 +391,84 @@ public class ResourcePermissionManager_Tests : PermissionTestBase
exception.Message.ShouldBe("The resource permission management provider 'TestUnavailable' is not available in the current context.");
}
[Fact]
public async Task GetAllAsync_Should_Not_Include_Grants_From_Unavailable_Provider()
{
// Grant via the available "Test" provider and the unavailable "TestUnavailable" provider
await _resourcePermissionGrantRepository.InsertAsync(new ResourcePermissionGrant(
Guid.NewGuid(),
"MyResourcePermission1",
TestEntityResource.ResourceName,
TestEntityResource.ResourceKey1,
"Test",
"someKey")
);
await _resourcePermissionGrantRepository.InsertAsync(new ResourcePermissionGrant(
Guid.NewGuid(),
"MyResourcePermission1",
TestEntityResource.ResourceName,
TestEntityResource.ResourceKey1,
"TestUnavailable",
"someKey")
);
var result = await _resourcePermissionManager.GetAllAsync(
TestEntityResource.ResourceName,
TestEntityResource.ResourceKey1);
var item = result.FirstOrDefault(x => x.Name == "MyResourcePermission1");
item.ShouldNotBeNull();
item.IsGranted.ShouldBeTrue();
item.Providers.ShouldContain(p => p.Name == "Test");
item.Providers.ShouldNotContain(p => p.Name == "TestUnavailable");
}
[Fact]
public async Task GetAllGroupAsync_Should_Not_Include_Grants_From_Unavailable_Provider()
{
await _resourcePermissionGrantRepository.InsertAsync(new ResourcePermissionGrant(
Guid.NewGuid(),
"MyResourcePermission2",
TestEntityResource.ResourceName,
TestEntityResource.ResourceKey1,
"TestUnavailable",
"someKey")
);
var group = await _resourcePermissionManager.GetAllGroupAsync(
TestEntityResource.ResourceName,
TestEntityResource.ResourceKey1);
group.ShouldNotContain(g => g.ProviderName == "TestUnavailable");
}
[Fact]
public async Task DeleteAsync_Should_Throw_When_Provider_Is_Unavailable()
{
var exception = await Assert.ThrowsAsync<AbpException>(async () =>
{
await _resourcePermissionManager.DeleteAsync(
TestEntityResource.ResourceName,
TestEntityResource.ResourceKey1,
"TestUnavailable",
"someKey");
});
exception.Message.ShouldBe("The resource permission management provider 'TestUnavailable' is not available in the current context.");
}
[Fact]
public async Task DeleteAsyncByName_Should_Throw_When_Provider_Is_Unavailable()
{
var exception = await Assert.ThrowsAsync<AbpException>(async () =>
{
await _resourcePermissionManager.DeleteAsync(
"MyResourcePermission1",
TestEntityResource.ResourceName,
TestEntityResource.ResourceKey1,
"TestUnavailable",
"someKey");
});
exception.Message.ShouldBe("The resource permission management provider 'TestUnavailable' is not available in the current context.");
}
}

Loading…
Cancel
Save