Browse Source

Support resource permissions in permission serialization

pull/24374/head
maliming 6 months ago
parent
commit
470cfdacde
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 5
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionDefinitionSerializer.cs
  2. 6
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDefinitionRecord.cs
  3. 17
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDefinitionSerializer.cs
  4. 6
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs
  5. 3
      modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/AbpPermissionManagementDbContextModelBuilderExtensions.cs
  6. 15
      modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionDefinitionRecordRepository_Tests.cs
  7. 64
      modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionDefinitionSerializer_Tests.cs
  8. 2
      modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/ResourcePermissionGrantCacheItemInvalidator_Tests.cs
  9. 2
      modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo/Abp/PermissionManagement/MongoDb/MongoDbPermissionDefinitionRecordRepository_Tests.cs
  10. 2
      modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestResourcePermissionDefinitionProvider.cs

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

@ -10,10 +10,13 @@ public interface IPermissionDefinitionSerializer
Task<(PermissionGroupDefinitionRecord[], PermissionDefinitionRecord[])> Task<(PermissionGroupDefinitionRecord[], PermissionDefinitionRecord[])>
SerializeAsync(IEnumerable<PermissionGroupDefinition> permissionGroups); SerializeAsync(IEnumerable<PermissionGroupDefinition> permissionGroups);
Task<PermissionDefinitionRecord[]> SerializeAsync(
IEnumerable<PermissionDefinition> permissions);
Task<PermissionGroupDefinitionRecord> SerializeAsync( Task<PermissionGroupDefinitionRecord> SerializeAsync(
PermissionGroupDefinition permissionGroup); PermissionGroupDefinition permissionGroup);
Task<PermissionDefinitionRecord> SerializeAsync( Task<PermissionDefinitionRecord> SerializeAsync(
PermissionDefinition permission, PermissionDefinition permission,
[CanBeNull] PermissionGroupDefinition permissionGroup); [CanBeNull] PermissionGroupDefinition permissionGroup);
} }

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

@ -53,7 +53,11 @@ public class PermissionDefinitionRecord : BasicAggregateRoot<Guid>, IHasExtraPro
string stateCheckers = null) string stateCheckers = null)
: base(id) : base(id)
{ {
GroupName = Check.NotNullOrWhiteSpace(groupName, nameof(groupName), PermissionGroupDefinitionRecordConsts.MaxNameLength); GroupName = groupName;
if (resourceName == null)
{
GroupName = Check.NotNullOrWhiteSpace(groupName, nameof(groupName), PermissionGroupDefinitionRecordConsts.MaxNameLength);
}
Name = Check.NotNullOrWhiteSpace(name, nameof(name), PermissionDefinitionRecordConsts.MaxNameLength); Name = Check.NotNullOrWhiteSpace(name, nameof(name), PermissionDefinitionRecordConsts.MaxNameLength);
ResourceName = resourceName; ResourceName = resourceName;
ParentName = Check.Length(parentName, nameof(parentName), PermissionDefinitionRecordConsts.MaxNameLength); ParentName = Check.Length(parentName, nameof(parentName), PermissionDefinitionRecordConsts.MaxNameLength);

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

@ -27,7 +27,7 @@ public class PermissionDefinitionSerializer : IPermissionDefinitionSerializer, I
GuidGenerator = guidGenerator; GuidGenerator = guidGenerator;
} }
public async Task<(PermissionGroupDefinitionRecord[], PermissionDefinitionRecord[])> public virtual async Task<(PermissionGroupDefinitionRecord[], PermissionDefinitionRecord[])>
SerializeAsync(IEnumerable<PermissionGroupDefinition> permissionGroups) SerializeAsync(IEnumerable<PermissionGroupDefinition> permissionGroups)
{ {
var permissionGroupRecords = new List<PermissionGroupDefinitionRecord>(); var permissionGroupRecords = new List<PermissionGroupDefinitionRecord>();
@ -46,7 +46,18 @@ public class PermissionDefinitionSerializer : IPermissionDefinitionSerializer, I
return (permissionGroupRecords.ToArray(), permissionRecords.ToArray()); return (permissionGroupRecords.ToArray(), permissionRecords.ToArray());
} }
public Task<PermissionGroupDefinitionRecord> SerializeAsync(PermissionGroupDefinition permissionGroup) public virtual async Task<PermissionDefinitionRecord[]> SerializeAsync(IEnumerable<PermissionDefinition> permissions)
{
var permissionRecords = new List<PermissionDefinitionRecord>();
foreach (var permission in permissions)
{
permissionRecords.Add(await SerializeAsync(permission, null));
}
return permissionRecords.ToArray();
}
public virtual Task<PermissionGroupDefinitionRecord> SerializeAsync(PermissionGroupDefinition permissionGroup)
{ {
using (CultureHelper.Use(CultureInfo.InvariantCulture)) using (CultureHelper.Use(CultureInfo.InvariantCulture))
{ {
@ -65,7 +76,7 @@ public class PermissionDefinitionSerializer : IPermissionDefinitionSerializer, I
} }
} }
public Task<PermissionDefinitionRecord> SerializeAsync( public virtual Task<PermissionDefinitionRecord> SerializeAsync(
PermissionDefinition permission, PermissionDefinition permission,
PermissionGroupDefinition permissionGroup) PermissionGroupDefinition permissionGroup)
{ {

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

@ -85,6 +85,12 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
await StaticStore.GetGroupsAsync() await StaticStore.GetGroupsAsync()
); );
var resourcePermissions = await PermissionSerializer.SerializeAsync(
await StaticStore.GetResourcePermissionsAsync()
);
permissionRecords = permissionRecords.Union(resourcePermissions).ToArray();
var currentHash = CalculateHash( var currentHash = CalculateHash(
permissionGroupRecords, permissionGroupRecords,
permissionRecords, permissionRecords,

3
modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/AbpPermissionManagementDbContextModelBuilderExtensions.cs

@ -69,8 +69,7 @@ public static class AbpPermissionManagementDbContextModelBuilderExtensions
b.ConfigureByConvention(); b.ConfigureByConvention();
b.Property(x => x.GroupName).HasMaxLength(PermissionGroupDefinitionRecordConsts.MaxNameLength) b.Property(x => x.GroupName).HasMaxLength(PermissionGroupDefinitionRecordConsts.MaxNameLength);
.IsRequired();
b.Property(x => x.Name).HasMaxLength(PermissionDefinitionRecordConsts.MaxNameLength).IsRequired(); b.Property(x => x.Name).HasMaxLength(PermissionDefinitionRecordConsts.MaxNameLength).IsRequired();
b.Property(x => x.ResourceName).HasMaxLength(PermissionDefinitionRecordConsts.MaxResourceNameLength); b.Property(x => x.ResourceName).HasMaxLength(PermissionDefinitionRecordConsts.MaxResourceNameLength);
b.Property(x => x.ParentName).HasMaxLength(PermissionDefinitionRecordConsts.MaxNameLength); b.Property(x => x.ParentName).HasMaxLength(PermissionDefinitionRecordConsts.MaxNameLength);

15
modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionDefinitionRecordRepository_Tests.cs

@ -26,4 +26,19 @@ public abstract class PermissionDefinitionRecordRepository_Tests<TStartupModule>
permission.ShouldNotBeNull(); permission.ShouldNotBeNull();
permission.Name.ShouldBe("MyPermission2"); permission.Name.ShouldBe("MyPermission2");
} }
[Fact]
public async Task FindByResourceNameAsync()
{
var qq = await PermissionDefinitionRecordRepository.GetListAsync();
var permission = await PermissionDefinitionRecordRepository.FindByNameAsync("MyResourcePermission1");
permission.ShouldNotBeNull();
permission.ResourceName.ShouldBe(TestEntityResource.ResourceName);
permission.Name.ShouldBe("MyResourcePermission1");
permission = await PermissionDefinitionRecordRepository.FindByNameAsync("MyResourcePermission2");
permission.ShouldNotBeNull();
permission.ResourceName.ShouldBe(TestEntityResource.ResourceName);
permission.Name.ShouldBe("MyResourcePermission2");
}
} }

64
modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionDefinitionSerializer_Tests.cs

@ -16,7 +16,7 @@ namespace Volo.Abp.PermissionManagement;
public class PermissionDefinitionSerializer_Tests : PermissionTestBase public class PermissionDefinitionSerializer_Tests : PermissionTestBase
{ {
private readonly IPermissionDefinitionSerializer _serializer; private readonly IPermissionDefinitionSerializer _serializer;
public PermissionDefinitionSerializer_Tests() public PermissionDefinitionSerializer_Tests()
{ {
_serializer = GetRequiredService<IPermissionDefinitionSerializer>(); _serializer = GetRequiredService<IPermissionDefinitionSerializer>();
@ -26,26 +26,26 @@ public class PermissionDefinitionSerializer_Tests : PermissionTestBase
public async Task Serialize_Permission_Group_Definition() public async Task Serialize_Permission_Group_Definition()
{ {
// Arrange // Arrange
var context = new PermissionDefinitionContext(null); var context = new PermissionDefinitionContext(null);
var group1 = CreatePermissionGroup1(context); var group1 = CreatePermissionGroup1(context);
// Act // Act
var permissionGroupRecord = await _serializer.SerializeAsync(group1); var permissionGroupRecord = await _serializer.SerializeAsync(group1);
//Assert //Assert
permissionGroupRecord.Name.ShouldBe("Group1"); permissionGroupRecord.Name.ShouldBe("Group1");
permissionGroupRecord.DisplayName.ShouldBe("F:Group one"); permissionGroupRecord.DisplayName.ShouldBe("F:Group one");
permissionGroupRecord.GetProperty("CustomProperty1").ShouldBe("CustomValue1"); permissionGroupRecord.GetProperty("CustomProperty1").ShouldBe("CustomValue1");
} }
[Fact] [Fact]
public async Task Serialize_Complex_Permission_Definition() public async Task Serialize_Complex_Permission_Definition()
{ {
// Arrange // Arrange
var context = new PermissionDefinitionContext(null); var context = new PermissionDefinitionContext(null);
var group1 = CreatePermissionGroup1(context); var group1 = CreatePermissionGroup1(context);
var permission1 = group1.AddPermission( var permission1 = group1.AddPermission(
@ -61,14 +61,14 @@ public class PermissionDefinitionSerializer_Tests : PermissionTestBase
.RequirePermissions(requiresAll: false, batchCheck: false,"Permission2", "Permission3"); .RequirePermissions(requiresAll: false, batchCheck: false,"Permission2", "Permission3");
// Act // Act
var permissionRecord = await _serializer.SerializeAsync( var permissionRecord = await _serializer.SerializeAsync(
permission1, permission1,
group1 group1
); );
//Assert //Assert
permissionRecord.Name.ShouldBe("Permission1"); permissionRecord.Name.ShouldBe("Permission1");
permissionRecord.GroupName.ShouldBe("Group1"); permissionRecord.GroupName.ShouldBe("Group1");
permissionRecord.DisplayName.ShouldBe("L:AbpPermissionManagement,Permission1"); permissionRecord.DisplayName.ShouldBe("L:AbpPermissionManagement,Permission1");
@ -78,6 +78,46 @@ public class PermissionDefinitionSerializer_Tests : PermissionTestBase
permissionRecord.StateCheckers.ShouldBe("[{\"T\":\"A\"},{\"T\":\"G\",\"A\":true,\"N\":[\"GlobalFeature1\",\"GlobalFeature2\"]},{\"T\":\"F\",\"A\":true,\"N\":[\"Feature1\",\"Feature2\"]},{\"T\":\"P\",\"A\":false,\"N\":[\"Permission2\",\"Permission3\"]}]"); permissionRecord.StateCheckers.ShouldBe("[{\"T\":\"A\"},{\"T\":\"G\",\"A\":true,\"N\":[\"GlobalFeature1\",\"GlobalFeature2\"]},{\"T\":\"F\",\"A\":true,\"N\":[\"Feature1\",\"Feature2\"]},{\"T\":\"P\",\"A\":false,\"N\":[\"Permission2\",\"Permission3\"]}]");
} }
[Fact]
public async Task Serialize_Complex_Resource_Permission_Definition()
{
// Arrange
var context = new PermissionDefinitionContext(null);
var resourcePermission1 = context.AddResourcePermission(
"ResourcePermission1",
TestEntityResource.ResourceName,
new LocalizableString(typeof(AbpPermissionManagementResource), "ResourcePermission1"),
MultiTenancySides.Tenant
)
.WithProviders("ProviderA", "ProviderB")
.WithProperty("CustomProperty2", "CustomValue2")
.RequireAuthenticated() //For for testing, not so meaningful
.RequireGlobalFeatures("GlobalFeature1", "GlobalFeature2")
.RequireFeatures("Feature1", "Feature2")
.RequirePermissions(requiresAll: false, batchCheck: false,"Permission2", "Permission3");
// Act
var permissionRecord = await _serializer.SerializeAsync(
resourcePermission1,
null
);
//Assert
permissionRecord.Name.ShouldBe("ResourcePermission1");
permissionRecord.GroupName.ShouldBe(null);
permissionRecord.ResourceName.ShouldBe(TestEntityResource.ResourceName);
permissionRecord.DisplayName.ShouldBe("L:AbpPermissionManagement,ResourcePermission1");
permissionRecord.GetProperty("CustomProperty2").ShouldBe("CustomValue2");
permissionRecord.Providers.ShouldBe("ProviderA,ProviderB");
permissionRecord.MultiTenancySide.ShouldBe(MultiTenancySides.Tenant);
permissionRecord.StateCheckers.ShouldBe("[{\"T\":\"A\"},{\"T\":\"G\",\"A\":true,\"N\":[\"GlobalFeature1\",\"GlobalFeature2\"]},{\"T\":\"F\",\"A\":true,\"N\":[\"Feature1\",\"Feature2\"]},{\"T\":\"P\",\"A\":false,\"N\":[\"Permission2\",\"Permission3\"]}]");
}
private static PermissionGroupDefinition CreatePermissionGroup1( private static PermissionGroupDefinition CreatePermissionGroup1(
IPermissionDefinitionContext context) IPermissionDefinitionContext context)
{ {
@ -85,9 +125,9 @@ public class PermissionDefinitionSerializer_Tests : PermissionTestBase
"Group1", "Group1",
displayName: new FixedLocalizableString("Group one") displayName: new FixedLocalizableString("Group one")
); );
group["CustomProperty1"] = "CustomValue1"; group["CustomProperty1"] = "CustomValue1";
return group; return group;
} }
} }

2
modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/ResourcePermissionGrantCacheItemInvalidator_Tests.cs

@ -58,7 +58,7 @@ public class ResourcePermissionGrantCacheItemInvalidator_Tests : PermissionTestB
UserPermissionValueProvider.ProviderName, UserPermissionValueProvider.ProviderName,
PermissionTestDataBuilder.User1Id.ToString()); PermissionTestDataBuilder.User1Id.ToString());
resourcePermissionGrant.ShouldNotBeNull(); resourcePermissionGrant.ShouldNotBeNull();
await _resourcePermissionGrantRepository.DeleteAsync(permissionGrant); await _resourcePermissionGrantRepository.DeleteAsync(resourcePermissionGrant);
(await _cache.GetAsync(ResourcePermissionGrantCacheItem.CalculateCacheKey("MyResourcePermission1", (await _cache.GetAsync(ResourcePermissionGrantCacheItem.CalculateCacheKey("MyResourcePermission1",
TestEntityResource.ResourceName, TestEntityResource.ResourceName,

2
modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo/Abp/PermissionManagement/MongoDb/MongoDbPermissionDefinitionRecordRepository_Tests.cs

@ -3,7 +3,7 @@
namespace Volo.Abp.PermissionManagement.MongoDB; namespace Volo.Abp.PermissionManagement.MongoDB;
[Collection(MongoTestCollection.Name)] [Collection(MongoTestCollection.Name)]
public class MongoDbPermissionDefinitionRecordRepository_Tests : PermissionGrantRepository_Tests<AbpPermissionManagementMongoDbTestModule> public class MongoDbPermissionDefinitionRecordRepository_Tests : PermissionDefinitionRecordRepository_Tests<AbpPermissionManagementMongoDbTestModule>
{ {
} }

2
modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestResourcePermissionDefinitionProvider.cs

@ -3,7 +3,7 @@ using Volo.Abp.MultiTenancy;
namespace Volo.Abp.PermissionManagement; namespace Volo.Abp.PermissionManagement;
public class TestResourcePermissionDefinitionProvider: PermissionDefinitionProvider public class TestResourcePermissionDefinitionProvider : PermissionDefinitionProvider
{ {
public override void Define(IPermissionDefinitionContext context) public override void Define(IPermissionDefinitionContext context)
{ {

Loading…
Cancel
Save