From 9987b0650e48253d1026ace727c60f0e210757e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 19 Aug 2022 14:52:59 +0300 Subject: [PATCH] Implemented PermissionsSimpleStateCheckerSerializerContributor and revised serializing. --- ...SimpleStateCheckerSerializerContributor.cs | 4 +- ...SimpleStateCheckerSerializerContributor.cs | 62 +++++++++++++++++++ .../RequirePermissionsSimpleStateChecker.cs | 4 ++ .../ISimpleStateCheckerSerializer.cs | 2 +- ...SimpleStateCheckerSerializerContributor.cs | 2 +- .../SimpleStateCheckerSerializer.cs | 4 +- .../SimpleStateCheckerSerializerExtensions.cs | 7 ++- ...SimpleStateCheckerSerializerContributor.cs | 2 +- ...SimpleStateCheckerSerializerContributor.cs | 2 +- ...StateCheckerSerializerContributor_Tests.cs | 2 +- ...StateCheckerSerializerContributor_Tests.cs | 2 +- ...StateCheckerSerializerContributor_Tests.cs | 2 +- ...cPermissionDefinitionStoreInMemoryCache.cs | 5 +- .../PermissionDefinitionSerializer_Tests.cs | 6 +- 14 files changed, 88 insertions(+), 18 deletions(-) create mode 100644 framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionsSimpleStateCheckerSerializerContributor.cs diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/AuthenticatedSimpleStateCheckerSerializerContributor.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/AuthenticatedSimpleStateCheckerSerializerContributor.cs index cb52f5f7ac..2a23b5bfcd 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/AuthenticatedSimpleStateCheckerSerializerContributor.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/AuthenticatedSimpleStateCheckerSerializerContributor.cs @@ -13,7 +13,7 @@ public class AuthenticatedSimpleStateCheckerSerializerContributor : public string SerializeToJson(ISimpleStateChecker checker) where TState : IHasSimpleStateCheckers { - if (checker is not RequireAuthenticatedSimpleStateChecker requireAuthenticatedSimpleStateChecker) + if (checker is not RequireAuthenticatedSimpleStateChecker) { return null; } @@ -25,7 +25,7 @@ public class AuthenticatedSimpleStateCheckerSerializerContributor : return jsonObject.ToJsonString(); } - public ISimpleStateChecker Deserialize(JsonObject jsonObject) + public ISimpleStateChecker Deserialize(JsonObject jsonObject, TState state) where TState : IHasSimpleStateCheckers { if (jsonObject["T"]?.ToString() != CheckerShortName) diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionsSimpleStateCheckerSerializerContributor.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionsSimpleStateCheckerSerializerContributor.cs new file mode 100644 index 0000000000..3b890797f6 --- /dev/null +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionsSimpleStateCheckerSerializerContributor.cs @@ -0,0 +1,62 @@ +using System.Linq; +using System.Text.Json.Nodes; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.DependencyInjection; +using Volo.Abp.SimpleStateChecking; + +namespace Volo.Abp.GlobalFeatures; + +public class PermissionsSimpleStateCheckerSerializerContributor : + ISimpleStateCheckerSerializerContributor, + ISingletonDependency +{ + public const string CheckerShortName = "P"; + + public string SerializeToJson(ISimpleStateChecker checker) + where TState : IHasSimpleStateCheckers + { + if (checker is not RequirePermissionsSimpleStateChecker permissionsSimpleStateChecker) + { + return null; + } + + var jsonObject = new JsonObject { + ["T"] = CheckerShortName, + ["A"] = permissionsSimpleStateChecker.RequiresAll + }; + + var nameArray = new JsonArray(); + foreach (var permissionName in permissionsSimpleStateChecker.PermissionNames) + { + nameArray.Add(permissionName); + } + + jsonObject["N"] = nameArray; + return jsonObject.ToJsonString(); + } + + public ISimpleStateChecker Deserialize( + JsonObject jsonObject, + TState state) + where TState : IHasSimpleStateCheckers + { + if (jsonObject["T"]?.ToString() != CheckerShortName) + { + return null; + } + + var nameArray = jsonObject["N"] as JsonArray; + if (nameArray == null) + { + throw new AbpException("'N' is not an array in the serialized state checker! JsonObject: " + jsonObject.ToJsonString()); + } + + return new RequirePermissionsSimpleStateChecker( + new RequirePermissionsSimpleBatchStateCheckerModel( + state, + nameArray.Select(x => x.ToString()).ToArray(), + (bool?)jsonObject["A"] ?? false + ) + ); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs index 3ae1809b55..fd8eef3791 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs @@ -8,6 +8,10 @@ namespace Volo.Abp.Authorization.Permissions; public class RequirePermissionsSimpleStateChecker : ISimpleStateChecker where TState : IHasSimpleStateCheckers { + public bool RequiresAll => _model.RequiresAll; + + public string[] PermissionNames => _model.Permissions; + private readonly RequirePermissionsSimpleBatchStateCheckerModel _model; public RequirePermissionsSimpleStateChecker(RequirePermissionsSimpleBatchStateCheckerModel model) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializer.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializer.cs index 00191b03d2..ffbed53cf7 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializer.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializer.cs @@ -7,6 +7,6 @@ public interface ISimpleStateCheckerSerializer public string Serialize(ISimpleStateChecker checker) where TState : IHasSimpleStateCheckers; - public ISimpleStateChecker Deserialize(JsonObject jsonObject) + public ISimpleStateChecker Deserialize(JsonObject jsonObject, TState state) where TState : IHasSimpleStateCheckers; } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializerContributor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializerContributor.cs index b36c41347e..d65c90eee6 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializerContributor.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializerContributor.cs @@ -10,6 +10,6 @@ public interface ISimpleStateCheckerSerializerContributor where TState : IHasSimpleStateCheckers; [CanBeNull] - public ISimpleStateChecker Deserialize(JsonObject jsonObject) + public ISimpleStateChecker Deserialize(JsonObject jsonObject, TState state) where TState : IHasSimpleStateCheckers; } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializer.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializer.cs index 9e7cfd47f7..d5d931ffae 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializer.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializer.cs @@ -33,12 +33,12 @@ public class SimpleStateCheckerSerializer : } [CanBeNull] - public ISimpleStateChecker Deserialize(JsonObject jsonObject) + public ISimpleStateChecker Deserialize(JsonObject jsonObject, TState state) where TState : IHasSimpleStateCheckers { foreach (var contributor in _contributors) { - var result = contributor.Deserialize(jsonObject); + var result = contributor.Deserialize(jsonObject, state); if (result != null) { return result; diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializerExtensions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializerExtensions.cs index 3c852fc901..1e4d272379 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializerExtensions.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializerExtensions.cs @@ -41,7 +41,8 @@ public static class SimpleStateCheckerSerializerExtensions public static ISimpleStateChecker[] DeserializeArray( this ISimpleStateCheckerSerializer serializer, - string value) + string value, + TState state) where TState : IHasSimpleStateCheckers { if (value.IsNullOrWhiteSpace()) @@ -63,7 +64,7 @@ public static class SimpleStateCheckerSerializerExtensions throw new AbpException("JSON value is not an array of objects: " + value); } - var checker = serializer.Deserialize(jsonObject); + var checker = serializer.Deserialize(jsonObject, state); if (checker == null) { return Array.Empty>(); @@ -81,7 +82,7 @@ public static class SimpleStateCheckerSerializerExtensions throw new AbpException("JSON value is not an array of objects: " + value); } - checkers[i] = serializer.Deserialize(jsonObject); + checkers[i] = serializer.Deserialize(jsonObject, state); } return checkers.Where(x => x != null).ToArray(); diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeaturesSimpleStateCheckerSerializerContributor.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeaturesSimpleStateCheckerSerializerContributor.cs index 7510cb4a24..58e2817139 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeaturesSimpleStateCheckerSerializerContributor.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeaturesSimpleStateCheckerSerializerContributor.cs @@ -34,7 +34,7 @@ public class FeaturesSimpleStateCheckerSerializerContributor : return jsonObject.ToJsonString(); } - public ISimpleStateChecker Deserialize(JsonObject jsonObject) + public ISimpleStateChecker Deserialize(JsonObject jsonObject, TState state) where TState : IHasSimpleStateCheckers { if (jsonObject["T"]?.ToString() != CheckerShortName) diff --git a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeaturesSimpleStateCheckerSerializerContributor.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeaturesSimpleStateCheckerSerializerContributor.cs index d140bbcc78..d4abc25403 100644 --- a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeaturesSimpleStateCheckerSerializerContributor.cs +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeaturesSimpleStateCheckerSerializerContributor.cs @@ -34,7 +34,7 @@ public class GlobalFeaturesSimpleStateCheckerSerializerContributor : return jsonObject.ToJsonString(); } - public ISimpleStateChecker Deserialize(JsonObject jsonObject) + public ISimpleStateChecker Deserialize(JsonObject jsonObject, TState state) where TState : IHasSimpleStateCheckers { if (jsonObject["T"]?.ToString() != CheckerShortName) diff --git a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AuthenticatedSimpleStateCheckerSerializerContributor_Tests.cs b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AuthenticatedSimpleStateCheckerSerializerContributor_Tests.cs index b6ae8bace4..0d84d167de 100644 --- a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AuthenticatedSimpleStateCheckerSerializerContributor_Tests.cs +++ b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AuthenticatedSimpleStateCheckerSerializerContributor_Tests.cs @@ -27,7 +27,7 @@ public class AuthenticatedSimpleStateCheckerSerializerContributor_Tests var serializer = new AuthenticatedSimpleStateCheckerSerializerContributor(); var jsonObject = (JsonObject)JsonNode.Parse("{\"T\":\"A\"}"); - var checker = serializer.Deserialize(jsonObject); + var checker = serializer.Deserialize(jsonObject, new MyState()); checker.ShouldBeOfType>(); var globalFeaturesSimpleStateChecker = checker as RequireAuthenticatedSimpleStateChecker; diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeaturesSimpleStateCheckerSerializerContributor_Tests.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeaturesSimpleStateCheckerSerializerContributor_Tests.cs index 28f7bb0b5e..9791ac44bc 100644 --- a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeaturesSimpleStateCheckerSerializerContributor_Tests.cs +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeaturesSimpleStateCheckerSerializerContributor_Tests.cs @@ -29,7 +29,7 @@ public class FeaturesSimpleStateCheckerSerializerContributor_Tests var serializer = new FeaturesSimpleStateCheckerSerializerContributor(); var jsonObject = (JsonObject)JsonNode.Parse("{\"T\":\"F\",\"A\":true,\"N\":[\"FeatureA\",\"FeatureB\"]}"); - var checker = serializer.Deserialize(jsonObject); + var checker = serializer.Deserialize(jsonObject, new MyState()); checker.ShouldBeOfType>(); var globalFeaturesSimpleStateChecker = checker as RequireFeaturesSimpleStateChecker; diff --git a/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo/Abp/GlobalFeatures/GlobalFeaturesSimpleStateCheckerSerializerContributor_Tests.cs b/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo/Abp/GlobalFeatures/GlobalFeaturesSimpleStateCheckerSerializerContributor_Tests.cs index c4878abca3..e0425775dc 100644 --- a/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo/Abp/GlobalFeatures/GlobalFeaturesSimpleStateCheckerSerializerContributor_Tests.cs +++ b/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo/Abp/GlobalFeatures/GlobalFeaturesSimpleStateCheckerSerializerContributor_Tests.cs @@ -29,7 +29,7 @@ public class GlobalFeaturesSimpleStateCheckerSerializerContributor_Tests var serializer = new GlobalFeaturesSimpleStateCheckerSerializerContributor(); var jsonObject = (JsonObject)JsonNode.Parse("{\"T\":\"G\",\"A\":true,\"N\":[\"FeatureA\",\"FeatureB\"]}"); - var checker = serializer.Deserialize(jsonObject); + var checker = serializer.Deserialize(jsonObject, new MyState()); checker.ShouldBeOfType>(); var globalFeaturesSimpleStateChecker = checker as RequireGlobalFeaturesSimpleStateChecker; diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStoreInMemoryCache.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStoreInMemoryCache.cs index 4e567aadea..30818ada68 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStoreInMemoryCache.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStoreInMemoryCache.cs @@ -100,8 +100,9 @@ public class DynamicPermissionDefinitionStoreInMemoryCache : if (!permissionRecord.StateCheckers.IsNullOrWhiteSpace()) { var checkers = StateCheckerSerializer - .DeserializeArray( - permissionRecord.StateCheckers + .DeserializeArray( + permissionRecord.StateCheckers, + permission ); permission.StateCheckers.AddRange(checkers); } diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionDefinitionSerializer_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionDefinitionSerializer_Tests.cs index 21f18cca1d..efef577a98 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionDefinitionSerializer_Tests.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionDefinitionSerializer_Tests.cs @@ -54,7 +54,9 @@ public class PermissionDefinitionSerializer_Tests : PermissionTestBase ) .WithProviders("ProviderA", "ProviderB") .WithProperty("CustomProperty2", "CustomValue2") - .RequireGlobalFeatures("GlobalFeature1", "GlobalFeature2"); + .RequireAuthenticated() //For for testing, not so meaningful + .RequireGlobalFeatures("GlobalFeature1", "GlobalFeature2") + .RequireFeatures("Feature1", "Feature2"); // Act @@ -71,7 +73,7 @@ public class PermissionDefinitionSerializer_Tests : PermissionTestBase permissionRecord.GetProperty("CustomProperty2").ShouldBe("CustomValue2"); permissionRecord.Providers.ShouldBe("ProviderA,ProviderB"); permissionRecord.MultiTenancySide.ShouldBe(MultiTenancySides.Tenant); - permissionRecord.StateCheckers.ShouldBe("[{\"T\":\"GF\",\"A\":true,\"N\":[\"GlobalFeature1\",\"GlobalFeature2\"]}]"); + permissionRecord.StateCheckers.ShouldBe("[{\"T\":\"A\"},{\"T\":\"G\",\"A\":true,\"N\":[\"GlobalFeature1\",\"GlobalFeature2\"]},{\"T\":\"F\",\"A\":true,\"N\":[\"Feature1\",\"Feature2\"]}]"); } private static PermissionGroupDefinition CreatePermissionGroup1(