From 76311660580d27170c682d5d6baf0b306dde82b6 Mon Sep 17 00:00:00 2001 From: enisn Date: Fri, 16 Apr 2021 16:47:23 +0300 Subject: [PATCH 1/3] Docs - Add Permission State Provider section to Authorization.md --- docs/en/Authorization.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/en/Authorization.md b/docs/en/Authorization.md index fbb71bb3d4..ebd6d4c3ea 100644 --- a/docs/en/Authorization.md +++ b/docs/en/Authorization.md @@ -236,6 +236,25 @@ When you write this code inside your permission definition provider, it finds th > Tip: It is better to check the value returned by the `GetPermissionOrNull` method since it may return null if the given permission was not defined. +### Permission depending on a Condition + +Permission states can be managed according to a condition such as a Feature, Global Feature, or a custom condition. Any condition which implements `IPermissionStateProvider` can be added via calling `AddStateProvider()` method for **PermissionDefinition**. + +See an example below: + +```csharp +myGroup.AddPermission("Author_Management") + // To depend on Global Feature + .AddStateProviders(new RequireGlobalFeaturesPermissionStateProvider("AuthorManagementFeature")); + // To depend on Feature + .AddStateProviders(new RequireFeaturesPermissionStateProvider("BookStore.AuthorManagement")); + // To depend on your custom implementation + .AddStateProviders(new MyCustomPermissionStateProvider()); + +``` + +If condition is not met, permission won't be displayed and all checks for that permission will return `false`. + ## IAuthorizationService ASP.NET Core provides the `IAuthorizationService` that can be used to check for authorization. Once you inject, you can use it in your code to conditionally control the authorization. From 2905ec3c2a123abaad3bd55163907ffb0977fbed Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 20 Apr 2021 13:53:20 +0300 Subject: [PATCH 2/3] Docs - Update State Provider section of Authorization.md --- docs/en/Authorization.md | 64 ++++++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 16 deletions(-) diff --git a/docs/en/Authorization.md b/docs/en/Authorization.md index d6cb8cee3f..22a88ce8cc 100644 --- a/docs/en/Authorization.md +++ b/docs/en/Authorization.md @@ -238,22 +238,54 @@ When you write this code inside your permission definition provider, it finds th ### Permission depending on a Condition -Permission states can be managed according to a condition such as a Feature, Global Feature, or a custom condition. Any condition which implements `IPermissionStateProvider` can be added via calling `AddStateProvider()` method for **PermissionDefinition**. - -See an example below: - -```csharp -myGroup.AddPermission("Author_Management") - // To depend on Global Feature - .AddStateProviders(new RequireGlobalFeaturesPermissionStateProvider("AuthorManagementFeature")); - // To depend on Feature - .AddStateProviders(new RequireFeaturesPermissionStateProvider("BookStore.AuthorManagement")); - // To depend on your custom implementation - .AddStateProviders(new MyCustomPermissionStateProvider()); - -``` - -If condition is not met, permission won't be displayed and all checks for that permission will return `false`. +You may want to disable a permission based on a condition. Disabled permissions are not visible on the UI and always returns `prohibited` when you check them + +Permission conditions can be managed according to a condition such as a Feature, Global Feature, or a custom condition. Any condition which implements `IPermissionStateProvider` can be added via calling `AddStateProvider()` method for **PermissionDefinition**. + +See examples below: + +- To depend on a Global Feature + + ```csharp + var authorPermission = myGroup.AddPermission("Author_Management"); + + // There are a couple of ways to do: + authorPermission.RequireGlobalFeatures("AuthorManagementFeature"); + authorPermission.RequireGlobalFeatures(typeof(AuthorManagementFeature)); + authorPermission.AddStateProviders(new RequireGlobalFeaturesPermissionStateProvider("AuthorManagementFeature")); + + // Even it can be depend on multiple: + authorPermission.RequireGlobalFeatures("BookStoreFeature", "AuthorManagementFeature"); + authorPermission.RequireGlobalFeatures(requiresAll: true, "BookStoreFeature", "AuthorManagementFeature"); + authorPermission.RequireGlobalFeatures(requiresAll: true, typeof(BookStoreFeature), (AuthorManagementFeature); + ``` + +- To depend on a Feature + + ```csharp + var authorPermission = myGroup.AddPermission("Author_Management"); + + // Pre-defined State Provider can be used: + authorPermission.AddStateProviders(new RequireFeaturesPermissionStateProvider("BookStore.AuthorManagement")); + + // Also can be depend on multiple features + authorPermission.AddStateProviders( + new RequireFeaturesPermissionStateProvider("BookStore.Authors","BookStore.AuthorManagement")); + + authorPermission.AddStateProviders( + new RequireFeaturesPermissionStateProvider(requiresAll: true, "BookStore.Authors","BookStore.AuthorManagement")); + ``` + +- To depend on a Custom Condition + + ```csharp + var authorPermission = myGroup.AddPermission("Author_Management"); + + // To depend on your custom condition + authorPermission.AddStateProviders(new MyCustomPermissionStateProvider()); + ``` + + Custom condition class have to implement `IPermissionStateProvider` ## IAuthorizationService From eafb3d79e69275216539c2a5581378cea5e0a33e Mon Sep 17 00:00:00 2001 From: enisn Date: Thu, 22 Apr 2021 10:01:22 +0300 Subject: [PATCH 3/3] Docs - Add GlobalStateProviders to Authorization.md --- docs/en/Authorization.md | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/docs/en/Authorization.md b/docs/en/Authorization.md index 22a88ce8cc..e44f96a034 100644 --- a/docs/en/Authorization.md +++ b/docs/en/Authorization.md @@ -285,7 +285,38 @@ See examples below: authorPermission.AddStateProviders(new MyCustomPermissionStateProvider()); ``` - Custom condition class have to implement `IPermissionStateProvider` + Custom condition class have to implement `IPermissionStateProvider`. + + - Also State Providers can be configured globally via using `GlobalStateProviders` in **AbpPermissionOptions** + + ```csharp + Configure(options => + { + options.GlobalStateProviders.Add(); + + // Or type can be pass as parameter: + options.GlobalStateProviders.Add(typeof(MyCustomPermissionStateProvider)); + }); + ``` + + Content of **MyCustomPermissionStateProvider** looks like: + + ```csharp + public class MyCustomPermissionStateProvider : IPermissionStateProvider + { + public Task IsEnabledAsync(PermissionStateContext context) + { + // You can implement your own logic here. + // That check works globally for each permission. + return Task.FromResult( + context.Permission.Name.StartsWith("Acme.BookStore")); + } + } + ``` + + + + ## IAuthorizationService