Skip to content

Commit ea32e2c

Browse files
committed
Enforce management permission checks for resource permissions
1 parent 64c09ac commit ea32e2c

File tree

8 files changed

+115
-18
lines changed

8 files changed

+115
-18
lines changed

framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/Resources/ResourcePermissionChecker.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,22 @@ public class ResourcePermissionChecker : IResourcePermissionChecker, ITransientD
1717
protected ICurrentTenant CurrentTenant { get; }
1818
protected IResourcePermissionValueProviderManager PermissionValueProviderManager { get; }
1919
protected ISimpleStateCheckerManager<PermissionDefinition> StateCheckerManager { get; }
20+
protected IPermissionChecker PermissionChecker { get; }
2021

2122
public ResourcePermissionChecker(
2223
ICurrentPrincipalAccessor principalAccessor,
2324
IPermissionDefinitionManager permissionDefinitionManager,
2425
ICurrentTenant currentTenant,
2526
IResourcePermissionValueProviderManager permissionValueProviderManager,
26-
ISimpleStateCheckerManager<PermissionDefinition> stateCheckerManager)
27+
ISimpleStateCheckerManager<PermissionDefinition> stateCheckerManager,
28+
IPermissionChecker permissionChecker)
2729
{
2830
PrincipalAccessor = principalAccessor;
2931
PermissionDefinitionManager = permissionDefinitionManager;
3032
CurrentTenant = currentTenant;
3133
PermissionValueProviderManager = permissionValueProviderManager;
3234
StateCheckerManager = stateCheckerManager;
35+
PermissionChecker = permissionChecker;
3336
}
3437

3538
public virtual async Task<bool> IsGrantedAsync(string name, string resourceName, string resourceKey)
@@ -69,6 +72,11 @@ public virtual async Task<bool> IsGrantedAsync(
6972
return false;
7073
}
7174

75+
if (!await PermissionChecker.IsGrantedAsync(claimsPrincipal, permission.ManagementPermissionName!))
76+
{
77+
return false;
78+
}
79+
7280
var isGranted = false;
7381
var context = new ResourcePermissionValueCheckContext(permission, claimsPrincipal, resourceName, resourceKey);
7482
foreach (var provider in PermissionValueProviderManager.ValueProviders)
@@ -96,7 +104,7 @@ public virtual async Task<bool> IsGrantedAsync(
96104

97105
public async Task<MultiplePermissionGrantResult> IsGrantedAsync(string[] names, string resourceName, string resourceKey)
98106
{
99-
return await IsGrantedAsync(PrincipalAccessor.Principal, names, resourceName,resourceKey);
107+
return await IsGrantedAsync(PrincipalAccessor.Principal, names, resourceName, resourceKey);
100108
}
101109

102110
public async Task<MultiplePermissionGrantResult> IsGrantedAsync(ClaimsPrincipal? claimsPrincipal, string[] names, string resourceName, string resourceKey)
@@ -116,7 +124,8 @@ public async Task<MultiplePermissionGrantResult> IsGrantedAsync(ClaimsPrincipal?
116124
foreach (var name in names)
117125
{
118126
var permission = await PermissionDefinitionManager.GetResourcePermissionOrNullAsync(resourceName, name);
119-
if (permission == null)
127+
if (permission == null ||
128+
!await PermissionChecker.IsGrantedAsync(claimsPrincipal, permission.ManagementPermissionName!))
120129
{
121130
result.Result.Add(name, PermissionGrantResult.Prohibited);
122131
continue;

framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/Resources/ResourcePermissionPopulator.cs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,20 @@ namespace Volo.Abp.Authorization.Permissions.Resources;
99
public class ResourcePermissionPopulator : ITransientDependency
1010
{
1111
protected IPermissionDefinitionManager PermissionDefinitionManager { get; }
12-
1312
protected IResourcePermissionChecker ResourcePermissionChecker { get; }
14-
1513
protected IResourcePermissionStore ResourcePermissionStore { get; }
14+
protected IPermissionChecker PermissionChecker { get; }
1615

1716
public ResourcePermissionPopulator(
1817
IPermissionDefinitionManager permissionDefinitionManager,
1918
IResourcePermissionChecker resourcePermissionChecker,
20-
IResourcePermissionStore resourcePermissionStore)
19+
IResourcePermissionStore resourcePermissionStore,
20+
IPermissionChecker permissionChecker)
2121
{
2222
PermissionDefinitionManager = permissionDefinitionManager;
2323
ResourcePermissionChecker = resourcePermissionChecker;
2424
ResourcePermissionStore = resourcePermissionStore;
25+
PermissionChecker = permissionChecker;
2526
}
2627

2728
public virtual async Task PopulateAsync<TResource>(TResource resource, string resourceName)
@@ -36,9 +37,8 @@ public virtual async Task PopulateAsync<TResource>(List<TResource> resources, st
3637
Check.NotNull(resources, nameof(resources));
3738
Check.NotNullOrWhiteSpace(resourceName, nameof(resourceName));
3839

39-
var resopurcePermissionNames = (await PermissionDefinitionManager.GetResourcePermissionsAsync())
40+
var resopurcePermissions = (await PermissionDefinitionManager.GetResourcePermissionsAsync())
4041
.Where(x => x.ResourceName == resourceName)
41-
.Select(x => x.Name)
4242
.ToArray();
4343

4444
foreach (var resource in resources)
@@ -48,17 +48,22 @@ public virtual async Task PopulateAsync<TResource>(List<TResource> resources, st
4848
{
4949
throw new AbpException("Resource key can not be null or empty.");
5050
}
51-
52-
var results = await ResourcePermissionChecker.IsGrantedAsync(resopurcePermissionNames, resourceName, resourceKey);
53-
foreach (var resopurcePermission in resopurcePermissionNames)
51+
52+
var results = await ResourcePermissionChecker.IsGrantedAsync(resopurcePermissions.Select(x => x.Name).ToArray(), resourceName, resourceKey);
53+
foreach (var resopurcePermission in resopurcePermissions)
5454
{
55+
if (!await PermissionChecker.IsGrantedAsync(resopurcePermission.ManagementPermissionName!))
56+
{
57+
continue;
58+
}
59+
5560
if (resource.ResourcePermissions == null)
5661
{
5762
ObjectHelper.TrySetProperty(resource, x => x.ResourcePermissions, () => new Dictionary<string, bool>());
5863
}
59-
60-
var hasPermission = results.Result.TryGetValue(resopurcePermission, out var granted) && granted == PermissionGrantResult.Granted;
61-
resource.ResourcePermissions![resopurcePermission] = hasPermission;
64+
65+
var hasPermission = results.Result.TryGetValue(resopurcePermission.Name, out var granted) && granted == PermissionGrantResult.Granted;
66+
resource.ResourcePermissions![resopurcePermission.Name] = hasPermission;
6267
}
6368
}
6469
}

framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/ResourcePermissionChecker_Tests.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public async Task IsGrantedAsync()
2121
{
2222
(await _resourcePermissionChecker.IsGrantedAsync("MyResourcePermission5", TestEntityResource.ResourceName, TestEntityResource.ResourceKey5)).ShouldBe(true);
2323
(await _resourcePermissionChecker.IsGrantedAsync("UndefinedResourcePermission", TestEntityResource.ResourceName, TestEntityResource.ResourceKey5)).ShouldBe(false);
24+
(await _resourcePermissionChecker.IsGrantedAsync("MyResourcePermission8", TestEntityResource.ResourceName, TestEntityResource.ResourceKey5)).ShouldBe(false);
2425
}
2526

2627
[Fact]
@@ -33,7 +34,8 @@ public async Task IsGranted_Multiple_Result_Async()
3334
"UndefinedPermission",
3435
"MyResourcePermission3",
3536
"MyResourcePermission4",
36-
"MyResourcePermission5"
37+
"MyResourcePermission5",
38+
"MyResourcePermission8"
3739
}, TestEntityResource.ResourceName, TestEntityResource.ResourceKey5);
3840

3941
result.Result["MyResourcePermission1"].ShouldBe(PermissionGrantResult.Undefined);
@@ -42,11 +44,13 @@ public async Task IsGranted_Multiple_Result_Async()
4244
result.Result["MyResourcePermission3"].ShouldBe(PermissionGrantResult.Granted);
4345
result.Result["MyResourcePermission4"].ShouldBe(PermissionGrantResult.Prohibited);
4446
result.Result["MyResourcePermission5"].ShouldBe(PermissionGrantResult.Granted);
47+
result.Result["MyResourcePermission8"].ShouldBe(PermissionGrantResult.Prohibited);
4548

4649
result = await _resourcePermissionChecker.IsGrantedAsync(new []
4750
{
4851
"MyResourcePermission6",
4952
}, TestEntityResource.ResourceName, TestEntityResource.ResourceKey6);
53+
5054
result.Result["MyResourcePermission6"].ShouldBe(PermissionGrantResult.Granted);
5155

5256
result = await _resourcePermissionChecker.IsGrantedAsync(new []
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using System.Collections.Generic;
2+
using System.Threading.Tasks;
3+
using Shouldly;
4+
using Volo.Abp.Authorization.Permissions.Resources;
5+
using Volo.Abp.Authorization.TestServices.Resources;
6+
using Xunit;
7+
8+
namespace Volo.Abp.Authorization;
9+
10+
public class ResourcePermissionPopulator_Tests : AuthorizationTestBase
11+
{
12+
private readonly ResourcePermissionPopulator _resourcePermissionPopulator;
13+
14+
public ResourcePermissionPopulator_Tests()
15+
{
16+
_resourcePermissionPopulator = GetRequiredService<ResourcePermissionPopulator>();
17+
}
18+
19+
[Fact]
20+
public async Task PopulateAsync()
21+
{
22+
var testResourceObject = new TestEntityResource(TestEntityResource.ResourceKey5);
23+
testResourceObject.ResourcePermissions.IsNullOrEmpty().ShouldBeTrue();
24+
25+
await _resourcePermissionPopulator.PopulateAsync<TestEntityResource>(
26+
testResourceObject,
27+
TestEntityResource.ResourceName
28+
);
29+
30+
testResourceObject.ResourcePermissions.ShouldNotBeNull();
31+
testResourceObject.ResourcePermissions.Count.ShouldBe(7); // Does not include MyResourcePermission8 because current user has no TestEntityManagementPermission2
32+
testResourceObject.ResourcePermissions["MyResourcePermission1"].ShouldBe(false);
33+
testResourceObject.ResourcePermissions["MyResourcePermission2"].ShouldBe(false);
34+
testResourceObject.ResourcePermissions["MyResourcePermission3"].ShouldBe(true);
35+
testResourceObject.ResourcePermissions["MyResourcePermission4"].ShouldBe(false);
36+
testResourceObject.ResourcePermissions["MyResourcePermission5"].ShouldBe(true);
37+
testResourceObject.ResourcePermissions["MyResourcePermission6"].ShouldBe(false);
38+
testResourceObject.ResourcePermissions["MyResourcePermission7"].ShouldBe(false);
39+
40+
testResourceObject = new TestEntityResource(TestEntityResource.ResourceKey6);
41+
testResourceObject.ResourcePermissions.IsNullOrEmpty().ShouldBeTrue();
42+
43+
await _resourcePermissionPopulator.PopulateAsync<TestEntityResource>(
44+
testResourceObject,
45+
TestEntityResource.ResourceName
46+
);
47+
48+
testResourceObject.ResourcePermissions.ShouldNotBeNull();
49+
testResourceObject.ResourcePermissions.Count.ShouldBe(7); // Does not include MyResourcePermission8 because current user has no TestEntityManagementPermission2
50+
testResourceObject.ResourcePermissions["MyResourcePermission1"].ShouldBe(false);
51+
testResourceObject.ResourcePermissions["MyResourcePermission2"].ShouldBe(false);
52+
testResourceObject.ResourcePermissions["MyResourcePermission3"].ShouldBe(false);
53+
testResourceObject.ResourcePermissions["MyResourcePermission4"].ShouldBe(false);
54+
testResourceObject.ResourcePermissions["MyResourcePermission5"].ShouldBe(false);
55+
testResourceObject.ResourcePermissions["MyResourcePermission6"].ShouldBe(true);
56+
testResourceObject.ResourcePermissions["MyResourcePermission7"].ShouldBe(false);
57+
}
58+
}

framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestServices/Resources/AuthorizationTestResourcePermissionDefinitionProvider.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public override void Define(IPermissionDefinitionContext context)
1414
getGroup = context.AddGroup("TestGroup");
1515
}
1616
getGroup.AddPermission("TestEntityManagementPermission");
17+
getGroup.AddPermission("TestEntityManagementPermission2");
1718

1819
var permission1 = context.AddResourcePermission("MyResourcePermission1", resourceName: TestEntityResource.ResourceName, "TestEntityManagementPermission");
1920
Assert.Throws<AbpException>(() =>
@@ -29,6 +30,7 @@ public override void Define(IPermissionDefinitionContext context)
2930
context.AddResourcePermission("MyResourcePermission5", resourceName: typeof(TestEntityResource).FullName!, "TestEntityManagementPermission");
3031
context.AddResourcePermission("MyResourcePermission6", resourceName: typeof(TestEntityResource).FullName!, "TestEntityManagementPermission").WithProviders(nameof(TestResourcePermissionValueProvider1));
3132
context.AddResourcePermission("MyResourcePermission7", resourceName: typeof(TestEntityResource).FullName!, "TestEntityManagementPermission").WithProviders(nameof(TestResourcePermissionValueProvider2));
33+
context.AddResourcePermission("MyResourcePermission8", resourceName: typeof(TestEntityResource).FullName!, "TestEntityManagementPermission2");
3234

3335
Assert.Throws<AbpException>(() =>
3436
{

framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestServices/Resources/FakeResourcePermissionStore.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public Task<MultiplePermissionGrantResult> IsGrantedAsync(string[] names, string
1919
var result = new MultiplePermissionGrantResult();
2020
foreach (var name in names)
2121
{
22-
result.Result.Add(name, (name == "MyResourcePermission3" || name == "MyResourcePermission5" &&
22+
result.Result.Add(name, ((name == "MyResourcePermission3" || name == "MyResourcePermission5") &&
2323
resourceName == TestEntityResource.ResourceName &&
2424
(resourceKey == TestEntityResource.ResourceKey3 || resourceKey == TestEntityResource.ResourceKey5)
2525
? PermissionGrantResult.Granted

framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestServices/Resources/TestEntityResource.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using System;
2+
using System.Collections.Generic;
3+
using Volo.Abp.Authorization.Permissions.Resources;
24

35
namespace Volo.Abp.Authorization.TestServices.Resources;
46

5-
public class TestEntityResource
7+
public class TestEntityResource : IHasResourcePermissions
68
{
79
public static readonly string ResourceName = typeof(TestEntityResource).FullName;
810

@@ -13,6 +15,20 @@ public class TestEntityResource
1315
public static readonly string ResourceKey5 = Guid.NewGuid().ToString();
1416
public static readonly string ResourceKey6 = Guid.NewGuid().ToString();
1517
public static readonly string ResourceKey7 = Guid.NewGuid().ToString();
18+
19+
private string Id { get; }
20+
21+
public TestEntityResource(string id)
22+
{
23+
Id = id;
24+
}
25+
26+
public string GetObjectKey()
27+
{
28+
return Id;
29+
}
30+
31+
public Dictionary<string, bool> ResourcePermissions { get; set; }
1632
}
1733

1834
public class TestEntityResource2

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,10 @@ public virtual async Task<GetResourcePermissionListResultDto> GetResourceAsync(s
267267
}
268268
}
269269

270-
result.Permissions.Add(resourcePermissionGrantInfoDto);
270+
if(resourcePermissionGrantInfoDto.Permissions.Any())
271+
{
272+
result.Permissions.Add(resourcePermissionGrantInfoDto);
273+
}
271274
}
272275

273276
return result;

0 commit comments

Comments
 (0)