Browse Source

Support resource permissions in permission serialization

pull/24374/head
maliming 3 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[])>
SerializeAsync(IEnumerable<PermissionGroupDefinition> permissionGroups);
Task<PermissionDefinitionRecord[]> SerializeAsync(
IEnumerable<PermissionDefinition> permissions);
Task<PermissionGroupDefinitionRecord> SerializeAsync(
PermissionGroupDefinition permissionGroup);
Task<PermissionDefinitionRecord> SerializeAsync(
PermissionDefinition permission,
[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)
: 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);
ResourceName = resourceName;
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;
}
public async Task<(PermissionGroupDefinitionRecord[], PermissionDefinitionRecord[])>
public virtual async Task<(PermissionGroupDefinitionRecord[], PermissionDefinitionRecord[])>
SerializeAsync(IEnumerable<PermissionGroupDefinition> permissionGroups)
{
var permissionGroupRecords = new List<PermissionGroupDefinitionRecord>();
@ -46,7 +46,18 @@ public class PermissionDefinitionSerializer : IPermissionDefinitionSerializer, I
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))
{
@ -65,7 +76,7 @@ public class PermissionDefinitionSerializer : IPermissionDefinitionSerializer, I
}
}
public Task<PermissionDefinitionRecord> SerializeAsync(
public virtual Task<PermissionDefinitionRecord> SerializeAsync(
PermissionDefinition permission,
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()
);
var resourcePermissions = await PermissionSerializer.SerializeAsync(
await StaticStore.GetResourcePermissionsAsync()
);
permissionRecords = permissionRecords.Union(resourcePermissions).ToArray();
var currentHash = CalculateHash(
permissionGroupRecords,
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.Property(x => x.GroupName).HasMaxLength(PermissionGroupDefinitionRecordConsts.MaxNameLength)
.IsRequired();
b.Property(x => x.GroupName).HasMaxLength(PermissionGroupDefinitionRecordConsts.MaxNameLength);
b.Property(x => x.Name).HasMaxLength(PermissionDefinitionRecordConsts.MaxNameLength).IsRequired();
b.Property(x => x.ResourceName).HasMaxLength(PermissionDefinitionRecordConsts.MaxResourceNameLength);
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.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
{
private readonly IPermissionDefinitionSerializer _serializer;
public PermissionDefinitionSerializer_Tests()
{
_serializer = GetRequiredService<IPermissionDefinitionSerializer>();
@ -26,26 +26,26 @@ public class PermissionDefinitionSerializer_Tests : PermissionTestBase
public async Task Serialize_Permission_Group_Definition()
{
// Arrange
var context = new PermissionDefinitionContext(null);
var group1 = CreatePermissionGroup1(context);
// Act
var permissionGroupRecord = await _serializer.SerializeAsync(group1);
//Assert
permissionGroupRecord.Name.ShouldBe("Group1");
permissionGroupRecord.DisplayName.ShouldBe("F:Group one");
permissionGroupRecord.GetProperty("CustomProperty1").ShouldBe("CustomValue1");
}
[Fact]
public async Task Serialize_Complex_Permission_Definition()
{
// Arrange
var context = new PermissionDefinitionContext(null);
var group1 = CreatePermissionGroup1(context);
var permission1 = group1.AddPermission(
@ -61,14 +61,14 @@ public class PermissionDefinitionSerializer_Tests : PermissionTestBase
.RequirePermissions(requiresAll: false, batchCheck: false,"Permission2", "Permission3");
// Act
var permissionRecord = await _serializer.SerializeAsync(
permission1,
group1
);
//Assert
permissionRecord.Name.ShouldBe("Permission1");
permissionRecord.GroupName.ShouldBe("Group1");
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\"]}]");
}
[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(
IPermissionDefinitionContext context)
{
@ -85,9 +125,9 @@ public class PermissionDefinitionSerializer_Tests : PermissionTestBase
"Group1",
displayName: new FixedLocalizableString("Group one")
);
group["CustomProperty1"] = "CustomValue1";
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,
PermissionTestDataBuilder.User1Id.ToString());
resourcePermissionGrant.ShouldNotBeNull();
await _resourcePermissionGrantRepository.DeleteAsync(permissionGrant);
await _resourcePermissionGrantRepository.DeleteAsync(resourcePermissionGrant);
(await _cache.GetAsync(ResourcePermissionGrantCacheItem.CalculateCacheKey("MyResourcePermission1",
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;
[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;
public class TestResourcePermissionDefinitionProvider: PermissionDefinitionProvider
public class TestResourcePermissionDefinitionProvider : PermissionDefinitionProvider
{
public override void Define(IPermissionDefinitionContext context)
{

Loading…
Cancel
Save