Skip to content

Commit 5f86700

Browse files
authored
Merge pull request #25017 from abpframework/fix/resource-permission-definition-bugs
fix: resource permission definition bugs in cache and event notification
2 parents a0fbdfd + ef84dba commit 5f86700

File tree

6 files changed

+268
-23
lines changed

6 files changed

+268
-23
lines changed

modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/Integration/IdentityUserIntegrationService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public virtual async Task<ListResultDto<RoleData>> SearchRoleAsync(RoleLookupSea
100100
{
101101
using (RoleRepository.DisableTracking())
102102
{
103-
var roles = await RoleRepository.GetListAsync(input.Filter);
103+
var roles = await RoleRepository.GetListAsync(sorting: input.Sorting, maxResultCount: input.MaxResultCount, skipCount: input.SkipCount, filter: input.Filter);
104104
return new ListResultDto<RoleData>(roles.Select(r => new RoleData(r.Id, r.Name, r.IsDefault, r.IsStatic, r.IsPublic, r.TenantId, r.ExtraProperties)).ToList());
105105
}
106106
}

modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/ResourcePermissionManagementModal.razor.cs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,12 @@ protected virtual async Task SelectedProviderKeyAsync(string value)
129129
ProviderKey = value;
130130
ProviderDisplayName = ProviderKeys.FirstOrDefault(p => p.ProviderKey == value)?.ProviderDisplayName;
131131

132+
if (value.IsNullOrWhiteSpace())
133+
{
134+
await InvokeAsync(StateHasChanged);
135+
return;
136+
}
137+
132138
var permissionGrants = await PermissionAppService.GetResourceByProviderAsync(ResourceName, ResourceKey, CurrentLookupService, ProviderKey);
133139
foreach (var permission in CreateEntity.Permissions)
134140
{
@@ -140,16 +146,23 @@ protected virtual async Task SelectedProviderKeyAsync(string value)
140146

141147
private async Task SearchProviderKeyAsync(AutocompleteReadDataEventArgs autocompleteReadDataEventArgs)
142148
{
143-
if ( !autocompleteReadDataEventArgs.CancellationToken.IsCancellationRequested )
149+
if (autocompleteReadDataEventArgs.CancellationToken.IsCancellationRequested)
144150
{
145-
if (autocompleteReadDataEventArgs.SearchValue.IsNullOrWhiteSpace())
146-
{
147-
ProviderKeys = new List<SearchProviderKeyInfo>();
148-
return;
149-
}
151+
return;
152+
}
150153

151-
ProviderKeys = (await PermissionAppService.SearchResourceProviderKeyAsync(ResourceName, CurrentLookupService, autocompleteReadDataEventArgs.SearchValue, 1)).Keys;
154+
if (autocompleteReadDataEventArgs.SearchValue.IsNullOrWhiteSpace())
155+
{
156+
ProviderKeys = new List<SearchProviderKeyInfo>();
157+
return;
158+
}
152159

160+
var lookupService = CurrentLookupService;
161+
var results = (await PermissionAppService.SearchResourceProviderKeyAsync(ResourceName, lookupService, autocompleteReadDataEventArgs.SearchValue, 1)).Keys;
162+
163+
if (!autocompleteReadDataEventArgs.CancellationToken.IsCancellationRequested)
164+
{
165+
ProviderKeys = results;
153166
await InvokeAsync(StateHasChanged);
154167
}
155168
}

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

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,19 @@ public Task FillAsync(
4848

4949
var context = new PermissionDefinitionContext(null);
5050

51-
var resourcePermissions = permissionRecords.Where(x => !x.ResourceName.IsNullOrWhiteSpace());
52-
foreach (var resourcePermission in resourcePermissions)
51+
var resourcePermissionRecords = permissionRecords.Where(x => !x.ResourceName.IsNullOrWhiteSpace());
52+
foreach (var resourcePermissionRecord in resourcePermissionRecords)
5353
{
54-
context.AddResourcePermission(resourcePermission.Name,
55-
resourcePermission.ResourceName,
56-
resourcePermission.ManagementPermissionName,
57-
resourcePermission.DisplayName != null ? LocalizableStringSerializer.Deserialize(resourcePermission.DisplayName) : null,
58-
resourcePermission.MultiTenancySide,
59-
resourcePermission.IsEnabled);
54+
var resourcePermission = context.AddResourcePermission(resourcePermissionRecord.Name,
55+
resourcePermissionRecord.ResourceName,
56+
resourcePermissionRecord.ManagementPermissionName,
57+
resourcePermissionRecord.DisplayName != null ? LocalizableStringSerializer.Deserialize(resourcePermissionRecord.DisplayName) : null,
58+
resourcePermissionRecord.MultiTenancySide,
59+
resourcePermissionRecord.IsEnabled);
60+
61+
ApplyPermissionProperties(resourcePermission, resourcePermissionRecord);
62+
63+
ResourcePermissionDefinitions.Add(resourcePermission);
6064
}
6165

6266
var permissions = permissionRecords.Where(x => x.ResourceName.IsNullOrWhiteSpace()).ToList();
@@ -124,6 +128,16 @@ private void AddPermissionRecursively(ICanAddChildPermission permissionContainer
124128

125129
PermissionDefinitions[permission.Name] = permission;
126130

131+
ApplyPermissionProperties(permission, permissionRecord);
132+
133+
foreach (var subPermission in allPermissionRecords.Where(p => p.ParentName == permissionRecord.Name))
134+
{
135+
AddPermissionRecursively(permission, subPermission, allPermissionRecords);
136+
}
137+
}
138+
139+
private void ApplyPermissionProperties(PermissionDefinition permission, PermissionDefinitionRecord permissionRecord)
140+
{
127141
if (!permissionRecord.Providers.IsNullOrWhiteSpace())
128142
{
129143
permission.Providers.AddRange(permissionRecord.Providers.Split(','));
@@ -143,10 +157,5 @@ private void AddPermissionRecursively(ICanAddChildPermission permissionContainer
143157
{
144158
permission[property.Key] = property.Value;
145159
}
146-
147-
foreach (var subPermission in allPermissionRecords.Where(p => p.ParentName == permissionRecord.Name))
148-
{
149-
AddPermissionRecursively(permission, subPermission, allPermissionRecords);
150-
}
151160
}
152161
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ private async Task<bool> UpdateChangedPermissionsAsync(IEnumerable<PermissionDef
281281

282282
if (changedRecords.Any())
283283
{
284-
newOrChangedPermissions.AddRange(newRecords.Select(x => x.Name));
284+
newOrChangedPermissions.AddRange(changedRecords.Select(x => x.Name));
285285
await PermissionRepository.UpdateManyAsync(changedRecords);
286286
}
287287

modules/permission-management/src/Volo.Abp.PermissionManagement.Web/AbpPermissionManagementWebModule.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
using Microsoft.Extensions.DependencyInjection;
1+
using Localization.Resources.AbpUi;
2+
using Microsoft.Extensions.DependencyInjection;
23
using Volo.Abp.AspNetCore.Mvc.Localization;
34
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap;
45
using Volo.Abp.Http.ProxyScripting.Generators.JQuery;
6+
using Volo.Abp.Localization;
57
using Volo.Abp.Mapperly;
68
using Volo.Abp.Modularity;
79
using Volo.Abp.PermissionManagement.Localization;
@@ -33,6 +35,13 @@ public override void PreConfigureServices(ServiceConfigurationContext context)
3335

3436
public override void ConfigureServices(ServiceConfigurationContext context)
3537
{
38+
Configure<AbpLocalizationOptions>(options =>
39+
{
40+
options.Resources
41+
.Get<AbpPermissionManagementResource>()
42+
.AddBaseTypes(typeof(AbpUiResource));
43+
});
44+
3645
Configure<AbpVirtualFileSystemOptions>(options =>
3746
{
3847
options.FileSets.AddEmbedded<AbpPermissionManagementWebModule>();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Threading.Tasks;
5+
using Shouldly;
6+
using Volo.Abp.MultiTenancy;
7+
using Xunit;
8+
9+
namespace Volo.Abp.PermissionManagement;
10+
11+
public class DynamicPermissionDefinitionStoreInMemoryCache_Tests : PermissionTestBase
12+
{
13+
private readonly IDynamicPermissionDefinitionStoreInMemoryCache _cache;
14+
15+
public DynamicPermissionDefinitionStoreInMemoryCache_Tests()
16+
{
17+
_cache = GetRequiredService<IDynamicPermissionDefinitionStoreInMemoryCache>();
18+
}
19+
20+
[Fact]
21+
public async Task FillAsync_Should_Populate_ResourcePermissionDefinitions()
22+
{
23+
// Arrange
24+
var permissionGroupRecords = new List<PermissionGroupDefinitionRecord>();
25+
var permissionRecords = new List<PermissionDefinitionRecord>
26+
{
27+
new PermissionDefinitionRecord(
28+
Guid.NewGuid(),
29+
groupName: null,
30+
name: "TestResourcePerm1",
31+
resourceName: "TestResource",
32+
managementPermissionName: "TestManagementPerm",
33+
parentName: null,
34+
displayName: "F:Test Resource Permission 1",
35+
isEnabled: true,
36+
multiTenancySide: MultiTenancySides.Both,
37+
providers: "R,U",
38+
stateCheckers: null
39+
)
40+
};
41+
42+
// Act
43+
await _cache.FillAsync(permissionGroupRecords, permissionRecords);
44+
45+
// Assert
46+
var resourcePermissions = _cache.GetResourcePermissions();
47+
resourcePermissions.Count.ShouldBe(1);
48+
49+
var resourcePermission = _cache.GetResourcePermissionOrNull("TestResource", "TestResourcePerm1");
50+
resourcePermission.ShouldNotBeNull();
51+
resourcePermission.Name.ShouldBe("TestResourcePerm1");
52+
resourcePermission.ResourceName.ShouldBe("TestResource");
53+
resourcePermission.ManagementPermissionName.ShouldBe("TestManagementPerm");
54+
resourcePermission.IsEnabled.ShouldBeTrue();
55+
resourcePermission.MultiTenancySide.ShouldBe(MultiTenancySides.Both);
56+
resourcePermission.Providers.Count.ShouldBe(2);
57+
resourcePermission.Providers.ShouldContain("R");
58+
resourcePermission.Providers.ShouldContain("U");
59+
}
60+
61+
[Fact]
62+
public async Task FillAsync_Should_Populate_ResourcePermission_With_ExtraProperties()
63+
{
64+
// Arrange
65+
var permissionGroupRecords = new List<PermissionGroupDefinitionRecord>();
66+
var record = new PermissionDefinitionRecord(
67+
Guid.NewGuid(),
68+
groupName: null,
69+
name: "TestResourcePerm2",
70+
resourceName: "TestResource",
71+
managementPermissionName: "TestManagementPerm",
72+
parentName: null,
73+
displayName: "F:Test Resource Permission 2"
74+
);
75+
record.ExtraProperties["CustomProp1"] = "CustomValue1";
76+
77+
var permissionRecords = new List<PermissionDefinitionRecord> { record };
78+
79+
// Act
80+
await _cache.FillAsync(permissionGroupRecords, permissionRecords);
81+
82+
// Assert
83+
var resourcePermission = _cache.GetResourcePermissionOrNull("TestResource", "TestResourcePerm2");
84+
resourcePermission.ShouldNotBeNull();
85+
resourcePermission["CustomProp1"].ShouldBe("CustomValue1");
86+
}
87+
88+
[Fact]
89+
public async Task FillAsync_Should_Not_Mix_Resource_And_Regular_Permissions()
90+
{
91+
// Arrange
92+
var permissionGroupRecords = new List<PermissionGroupDefinitionRecord>
93+
{
94+
new PermissionGroupDefinitionRecord(
95+
Guid.NewGuid(),
96+
name: "TestGroup",
97+
displayName: "F:Test Group"
98+
)
99+
};
100+
101+
var permissionRecords = new List<PermissionDefinitionRecord>
102+
{
103+
// Regular permission
104+
new PermissionDefinitionRecord(
105+
Guid.NewGuid(),
106+
groupName: "TestGroup",
107+
name: "RegularPerm1",
108+
resourceName: null,
109+
managementPermissionName: null,
110+
parentName: null,
111+
displayName: "F:Regular Permission 1"
112+
),
113+
// Resource permission
114+
new PermissionDefinitionRecord(
115+
Guid.NewGuid(),
116+
groupName: null,
117+
name: "ResourcePerm1",
118+
resourceName: "TestResource",
119+
managementPermissionName: "ManagementPerm",
120+
parentName: null,
121+
displayName: "F:Resource Permission 1"
122+
)
123+
};
124+
125+
// Act
126+
await _cache.FillAsync(permissionGroupRecords, permissionRecords);
127+
128+
// Assert
129+
var regularPermissions = _cache.GetPermissions();
130+
regularPermissions.Count.ShouldBe(1);
131+
regularPermissions.First().Name.ShouldBe("RegularPerm1");
132+
133+
var resourcePermissions = _cache.GetResourcePermissions();
134+
resourcePermissions.Count.ShouldBe(1);
135+
resourcePermissions.First().Name.ShouldBe("ResourcePerm1");
136+
137+
_cache.GetPermissionOrNull("RegularPerm1").ShouldNotBeNull();
138+
_cache.GetPermissionOrNull("ResourcePerm1").ShouldBeNull();
139+
140+
_cache.GetResourcePermissionOrNull("TestResource", "ResourcePerm1").ShouldNotBeNull();
141+
_cache.GetResourcePermissionOrNull("TestResource", "RegularPerm1").ShouldBeNull();
142+
}
143+
144+
[Fact]
145+
public async Task FillAsync_Should_Populate_ResourcePermission_With_StateCheckers()
146+
{
147+
// Arrange
148+
var permissionGroupRecords = new List<PermissionGroupDefinitionRecord>();
149+
var permissionRecords = new List<PermissionDefinitionRecord>
150+
{
151+
new PermissionDefinitionRecord(
152+
Guid.NewGuid(),
153+
groupName: null,
154+
name: "TestResourcePerm3",
155+
resourceName: "TestResource",
156+
managementPermissionName: "TestManagementPerm",
157+
parentName: null,
158+
displayName: "F:Test Resource Permission 3",
159+
stateCheckers: "[{\"T\":\"A\"}]"
160+
)
161+
};
162+
163+
// Act
164+
await _cache.FillAsync(permissionGroupRecords, permissionRecords);
165+
166+
// Assert
167+
var resourcePermission = _cache.GetResourcePermissionOrNull("TestResource", "TestResourcePerm3");
168+
resourcePermission.ShouldNotBeNull();
169+
resourcePermission.StateCheckers.Count.ShouldBe(1);
170+
}
171+
172+
[Fact]
173+
public async Task FillAsync_Should_Clear_Previous_ResourcePermissions()
174+
{
175+
// Arrange - first fill
176+
var permissionRecords1 = new List<PermissionDefinitionRecord>
177+
{
178+
new PermissionDefinitionRecord(
179+
Guid.NewGuid(),
180+
groupName: null,
181+
name: "OldResourcePerm",
182+
resourceName: "TestResource",
183+
managementPermissionName: "ManagementPerm",
184+
parentName: null,
185+
displayName: "F:Old Resource Permission"
186+
)
187+
};
188+
await _cache.FillAsync(new List<PermissionGroupDefinitionRecord>(), permissionRecords1);
189+
_cache.GetResourcePermissions().Count.ShouldBe(1);
190+
191+
// Arrange - second fill with different data
192+
var permissionRecords2 = new List<PermissionDefinitionRecord>
193+
{
194+
new PermissionDefinitionRecord(
195+
Guid.NewGuid(),
196+
groupName: null,
197+
name: "NewResourcePerm",
198+
resourceName: "TestResource",
199+
managementPermissionName: "ManagementPerm",
200+
parentName: null,
201+
displayName: "F:New Resource Permission"
202+
)
203+
};
204+
205+
// Act
206+
await _cache.FillAsync(new List<PermissionGroupDefinitionRecord>(), permissionRecords2);
207+
208+
// Assert
209+
var resourcePermissions = _cache.GetResourcePermissions();
210+
resourcePermissions.Count.ShouldBe(1);
211+
resourcePermissions.First().Name.ShouldBe("NewResourcePerm");
212+
_cache.GetResourcePermissionOrNull("TestResource", "OldResourcePerm").ShouldBeNull();
213+
}
214+
}

0 commit comments

Comments
 (0)