diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IPermissionDefinitionProvider.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IPermissionDefinitionProvider.cs index ef92125595..206176ac52 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IPermissionDefinitionProvider.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IPermissionDefinitionProvider.cs @@ -2,6 +2,10 @@ { public interface IPermissionDefinitionProvider { + void PreDefine(IPermissionDefinitionContext context); + void Define(IPermissionDefinitionContext context); + + void PostDefine(IPermissionDefinitionContext context); } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionContext.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionContext.cs index 95f02b5aee..4e52cdc2ee 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionContext.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionContext.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using JetBrains.Annotations; using Volo.Abp.Localization; using Volo.Abp.MultiTenancy; @@ -7,10 +8,13 @@ namespace Volo.Abp.Authorization.Permissions { public class PermissionDefinitionContext : IPermissionDefinitionContext { + public IServiceProvider ServiceProvider { get; } + internal Dictionary Groups { get; } - internal PermissionDefinitionContext() + internal PermissionDefinitionContext(IServiceProvider serviceProvider) { + ServiceProvider = serviceProvider; Groups = new Dictionary(); } diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionManager.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionManager.cs index 7e193feda0..fba618fc78 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionManager.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionManager.cs @@ -83,7 +83,7 @@ namespace Volo.Abp.Authorization.Permissions } protected virtual void AddPermissionToDictionaryRecursively( - Dictionary permissions, + Dictionary permissions, PermissionDefinition permission) { if (permissions.ContainsKey(permission.Name)) @@ -101,22 +101,32 @@ namespace Volo.Abp.Authorization.Permissions protected virtual Dictionary CreatePermissionGroupDefinitions() { - var context = new PermissionDefinitionContext(); - using (var scope = _serviceProvider.CreateScope()) { + var context = new PermissionDefinitionContext(scope.ServiceProvider); + var providers = Options - .DefinitionProviders - .Select(p => scope.ServiceProvider.GetRequiredService(p) as IPermissionDefinitionProvider) - .ToList(); + .DefinitionProviders + .Select(p => scope.ServiceProvider.GetRequiredService(p) as IPermissionDefinitionProvider) + .ToList(); + + foreach (var provider in providers) + { + provider.PreDefine(context); + } foreach (var provider in providers) { provider.Define(context); } - } - return context.Groups; + foreach (var provider in providers) + { + provider.PostDefine(context); + } + + return context.Groups; + } } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionProvider.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionProvider.cs index 0584ffe426..b6fcff3429 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionProvider.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionProvider.cs @@ -4,6 +4,16 @@ namespace Volo.Abp.Authorization.Permissions { public abstract class PermissionDefinitionProvider : IPermissionDefinitionProvider, ITransientDependency { + public virtual void PreDefine(IPermissionDefinitionContext context) + { + + } + public abstract void Define(IPermissionDefinitionContext context); + + public virtual void PostDefine(IPermissionDefinitionContext context) + { + + } } } \ No newline at end of file