From 52b6f31807dbc80c27de974145a65cc40975c6f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 15 Feb 2018 16:50:23 +0300 Subject: [PATCH] Getting list of permissions --- .../AbpDeskPermissionDefinitionProvider.cs | 17 ++- .../Abp/Permissions/PermissionAppService.cs | 139 ++++++------------ .../IPermissionManagementProvider.cs | 3 +- .../Abp/Permissions/IPermissionManager.cs | 2 +- .../Volo/Abp/Permissions/PermissionManager.cs | 34 +++-- .../IPermissionDefinitionContext.cs | 4 +- .../IPermissionDefinitionManager.cs | 4 +- .../IPermissionDefinitionProvider.cs | 6 +- .../Abp/Permissions/PermissionDefinition.cs | 6 +- .../PermissionDefinitionContext.cs | 56 +------ .../PermissionDefinitionManager.cs | 50 ++++++- .../PermissionDefinitionProvider.cs | 6 +- .../Permissions/PermissionGroupDefinition.cs | 76 ++++++++++ .../TestPermissionDefinitionProvider.cs | 6 +- 14 files changed, 226 insertions(+), 183 deletions(-) create mode 100644 src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionGroupDefinition.cs diff --git a/src/AbpDesk/AbpDesk.Web.Mvc/Permissions/AbpDeskPermissionDefinitionProvider.cs b/src/AbpDesk/AbpDesk.Web.Mvc/Permissions/AbpDeskPermissionDefinitionProvider.cs index 8300ce13f6..1e98c94086 100644 --- a/src/AbpDesk/AbpDesk.Web.Mvc/Permissions/AbpDeskPermissionDefinitionProvider.cs +++ b/src/AbpDesk/AbpDesk.Web.Mvc/Permissions/AbpDeskPermissionDefinitionProvider.cs @@ -2,17 +2,26 @@ namespace AbpDesk.Web.Mvc.Permissions { - public class AbpDeskPermissionDefinitionProvider : IPermissionDefinitionProvider + public class AbpDeskPermissionDefinitionProvider : PermissionDefinitionProvider { - public void Define(IPermissionDefinitionContext context) + public override void Define(IPermissionDefinitionContext context) { - var tickets = context.Add("AbpDesk.Tickets"); + var abpDeskGroup = context.AddGroup("AbpDesk"); + + var tickets = abpDeskGroup.AddPermission("AbpDesk.Tickets"); tickets.AddChild("AbpDesk.Tickets.Reply"); tickets.AddChild("AbpDesk.Tickets.Close"); - var customers = context.Add("AbpDesk.Customers"); + var customers = abpDeskGroup.AddPermission("AbpDesk.Customers"); customers.AddChild("AbpDesk.Customers.Create"); customers.AddChild("AbpDesk.Customers.Delete"); + + var identityGroup = context.AddGroup("Identity"); + + var userManagement = identityGroup.AddPermission("Identity.UserManagement"); + userManagement.AddChild("Identity.UserManagement.Create"); + userManagement.AddChild("Identity.UserManagement.Update"); + userManagement.AddChild("Identity.UserManagement.Delete"); } } } diff --git a/src/Volo.Abp.Permissions.Application/Volo/Abp/Permissions/PermissionAppService.cs b/src/Volo.Abp.Permissions.Application/Volo/Abp/Permissions/PermissionAppService.cs index fda7e42430..5de9cef456 100644 --- a/src/Volo.Abp.Permissions.Application/Volo/Abp/Permissions/PermissionAppService.cs +++ b/src/Volo.Abp.Permissions.Application/Volo/Abp/Permissions/PermissionAppService.cs @@ -8,10 +8,14 @@ namespace Volo.Abp.Permissions public class PermissionAppService : ApplicationService, IPermissionAppService { private readonly IPermissionManager _permissionManager; + private readonly IPermissionDefinitionManager _permissionDefinitionManager; - public PermissionAppService(IPermissionManager permissionManager) + public PermissionAppService( + IPermissionManager permissionManager, + IPermissionDefinitionManager permissionDefinitionManager) { _permissionManager = permissionManager; + _permissionDefinitionManager = permissionDefinitionManager; } public async Task GetAsync(string name, string providerName, string providerKey) @@ -21,109 +25,50 @@ namespace Volo.Abp.Permissions public async Task GetListAsync(string providerName, string providerKey) { - var permissionInfos = await _permissionManager.GetAllAsync(providerName, providerKey); - - return new GetPermissionListResultDto + var result = new GetPermissionListResultDto + { + Groups = new List() + }; + + foreach (var group in _permissionDefinitionManager.GetGroups()) { - Groups = new List + var groupDto = new PermissionGroupDto { - new PermissionGroupDto + Name = group.Name, + DisplayName = group.Name, //TODO: DisplayName + Permissions = new List() + }; + + foreach (var permission in group.GetPermissionsWithChildren()) + { + var grantInfoDto = new PermissionGrantInfoDto { - Name = "Volo.Calendar", - DisplayName = "Calendar", - Permissions = new List - { - new PermissionGrantInfoDto - { - Name = "CalendarManagement", - DisplayName = "Calendar management", - ParentName = null, - IsGranted = true, - Providers = new List - { - new ProviderInfoDto - { - ProviderKey = "Role", - ProviderName = "Moderator" - }, - new ProviderInfoDto - { - ProviderKey = "OU", - ProviderName = "44238045-6f18-44cd-8f1f-4e2d61ef1c81" - } - } - }, - new PermissionGrantInfoDto - { - Name = "CreateNewCalendar", - DisplayName = "Create new calendar", - ParentName = "CalendarManagement", - IsGranted = true, - Providers = new List - { - new ProviderInfoDto - { - ProviderKey = "User", - ProviderName = "bb3c2a2f-118d-4d2e-b1d5-e07f3b0a917c" - } - } - }, - new PermissionGrantInfoDto - { - Name = "DeleteExistingCalendars", - DisplayName = "Delete existing calendars", - ParentName = "CalendarManagement", - IsGranted = false - } - } - }, - new PermissionGroupDto + Name = permission.Name, + DisplayName = permission.Name, //TODO: Add DisplayName to permission definition + ParentName = permission.Parent?.Name, + Providers = new List() + }; + + var grantInfo = await _permissionManager.GetAsync(permission.Name, providerName, providerKey); + + grantInfoDto.IsGranted = grantInfo.IsGranted; + + foreach (var provider in grantInfo.Providers) { - Name = "Volo.Identity", - DisplayName = "Identity", - Permissions = new List + grantInfoDto.Providers.Add(new ProviderInfoDto { - new PermissionGrantInfoDto - { - Name = "UserManagement", - DisplayName = "User management", - ParentName = null, - IsGranted = true, - Providers = new List - { - new ProviderInfoDto - { - ProviderKey = "Role", - ProviderName = "Administrator" - } - } - }, - new PermissionGrantInfoDto - { - Name = "CreateNewUser", - DisplayName = "Create new user", - ParentName = "UserManagement", - IsGranted = true, - Providers = new List - { - new ProviderInfoDto - { - ProviderKey = "User", - ProviderName = "bb3c2a2f-118d-4d2e-b1d5-e07f3b0a917c" - } - } - }, - new PermissionGrantInfoDto - { - Name = "DeleteExistingUsers", - DisplayName = "Delete existing users", - ParentName = "UserManagement", - IsGranted = false - } - } + ProviderName = provider.Name, + ProviderKey = provider.Key, + }); } + + groupDto.Permissions.Add(grantInfoDto); } - }; + + result.Groups.Add(groupDto); + } + + return result; } public async Task UpdateAsync(string providerName, string providerKey, UpdatePermissionsDto input) diff --git a/src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/IPermissionManagementProvider.cs b/src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/IPermissionManagementProvider.cs index 83ec4413ce..0b1d952b42 100644 --- a/src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/IPermissionManagementProvider.cs +++ b/src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/IPermissionManagementProvider.cs @@ -1,8 +1,9 @@ using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; namespace Volo.Abp.Permissions { - public interface IPermissionManagementProvider + public interface IPermissionManagementProvider : ISingletonDependency //TODO: Create an abstract base class. { string Name { get; } diff --git a/src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/IPermissionManager.cs b/src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/IPermissionManager.cs index bd166bdfde..71020f2358 100644 --- a/src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/IPermissionManager.cs +++ b/src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/IPermissionManager.cs @@ -6,7 +6,7 @@ namespace Volo.Abp.Permissions { public interface IPermissionManager { - //Task GetAsync([NotNull]string name, [NotNull] string providerName, [NotNull] string providerKey); + Task GetAsync(string name, string providerName, string providerKey); Task> GetAllAsync([NotNull] string providerName, [NotNull] string providerKey); diff --git a/src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionManager.cs b/src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionManager.cs index f47476e0fa..7e1d31f2bd 100644 --- a/src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionManager.cs +++ b/src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionManager.cs @@ -104,28 +104,38 @@ namespace Volo.Abp.Permissions // await PermissionGrantRepository.DeleteAsync(grant); //} + public async Task GetAsync(string name, string providerName, string providerKey) + { + return await GetInternalAsync(PermissionDefinitionManager.Get(name), providerName, providerKey); + } + public async Task> GetAllAsync(string providerName, string providerKey) { var results = new List(); - foreach (var permissionDefinition in PermissionDefinitionManager.GetAll()) + foreach (var permissionDefinition in PermissionDefinitionManager.GetPermissions()) { - var result = new PermissionWithGrantedProviders(permissionDefinition.Name, false); + results.Add(await GetInternalAsync(permissionDefinition, providerName, providerKey)); + } + + return results; + } + + public async Task GetInternalAsync(PermissionDefinition permissionDefinition, string providerName, string providerKey) + { + var result = new PermissionWithGrantedProviders(permissionDefinition.Name, false); - foreach (var provider in ManagementProviders) + foreach (var provider in ManagementProviders) + { + var providerResult = await provider.CheckAsync(permissionDefinition.Name, providerName, providerKey); + if (providerResult.IsGranted) { - var providerResult = await provider.CheckAsync(permissionDefinition.Name, providerName, providerKey); - if (providerResult.IsGranted) - { - result.IsGranted = true; - result.Providers.Add(new PermissionValueProviderInfo(provider.Name, providerResult.ProviderKey)); - } + result.IsGranted = true; + result.Providers.Add(new PermissionValueProviderInfo(provider.Name, providerResult.ProviderKey)); } - - results.Add(result); } - return results; + return result; } } } \ No newline at end of file diff --git a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionDefinitionContext.cs b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionDefinitionContext.cs index 0035821634..dedf471d56 100644 --- a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionDefinitionContext.cs +++ b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionDefinitionContext.cs @@ -4,8 +4,8 @@ namespace Volo.Abp.Permissions { public interface IPermissionDefinitionContext { - PermissionDefinition GetOrNull([NotNull] string name); + //TODO: Add Get methods to find and modify a permission or group. - PermissionDefinition Add([NotNull] string name); + PermissionGroupDefinition AddGroup([NotNull] string name); } } \ No newline at end of file diff --git a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionDefinitionManager.cs b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionDefinitionManager.cs index 1bb280d3d3..52fd62acfc 100644 --- a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionDefinitionManager.cs +++ b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionDefinitionManager.cs @@ -8,6 +8,8 @@ namespace Volo.Abp.Permissions [NotNull] PermissionDefinition Get([NotNull] string name); - IReadOnlyList GetAll(); + IReadOnlyList GetPermissions(); + + IReadOnlyList GetGroups(); } } \ No newline at end of file diff --git a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionDefinitionProvider.cs b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionDefinitionProvider.cs index a778a29bfb..fd23aad5fe 100644 --- a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionDefinitionProvider.cs +++ b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionDefinitionProvider.cs @@ -1,6 +1,8 @@ -namespace Volo.Abp.Permissions +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Permissions { - public interface IPermissionDefinitionProvider + public interface IPermissionDefinitionProvider : ISingletonDependency { void Define(IPermissionDefinitionContext context); } diff --git a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinition.cs b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinition.cs index 7f297c21bf..1415b21b73 100644 --- a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinition.cs +++ b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinition.cs @@ -19,7 +19,7 @@ namespace Volo.Abp.Permissions public IReadOnlyList Children => _children.ToImmutableList(); private readonly List _children; - public Dictionary Properties { get; set; } + public Dictionary Properties { get; } /// /// Gets/sets a key-value on the . @@ -38,6 +38,8 @@ namespace Volo.Abp.Permissions protected internal PermissionDefinition(string name) { Name = name; + + Properties = new Dictionary(); _children = new List(); } @@ -55,7 +57,7 @@ namespace Volo.Abp.Permissions public override string ToString() { - return $"[Permission {Name}]"; + return $"[{nameof(PermissionDefinition)} {Name}]"; } } } \ No newline at end of file diff --git a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinitionContext.cs b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinitionContext.cs index 3461398012..bf3ee824b5 100644 --- a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinitionContext.cs +++ b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinitionContext.cs @@ -6,65 +6,23 @@ namespace Volo.Abp.Permissions { public class PermissionDefinitionContext : IPermissionDefinitionContext { - internal Dictionary Permissions { get; } + internal Dictionary Groups { get; } - public PermissionDefinitionContext() + internal PermissionDefinitionContext() { - Permissions = new Dictionary(); + Groups = new Dictionary(); } - public virtual PermissionDefinition GetOrNull(string name) + public virtual PermissionGroupDefinition AddGroup(string name) { Check.NotNull(name, nameof(name)); - return Permissions.GetOrDefault(name); - } - - public virtual IReadOnlyList GetAll() - { - return Permissions.Values.ToImmutableList(); - } - - public virtual PermissionDefinition Add(string name) - { - Check.NotNull(name, nameof(name)); - - if (Permissions.ContainsKey(name)) + if (Groups.ContainsKey(name)) { - throw new AbpException($"There is already an existing permission with name: {name}"); + throw new AbpException($"There is already an existing permission group with name: {name}"); } - return Permissions[name] = new PermissionDefinition(name); - } - - internal void HandleNewChildren() - { - Permissions.Values - .SelectMany(p => p.Children) - .ToList() - .ForEach(AddPermissionRecursively); - } - - private void AddPermissionRecursively(PermissionDefinition permission) - { - //Prevent multiple adding of same named permission. - if (Permissions.TryGetValue(permission.Name, out var existingPermission)) - { - if (existingPermission != permission) - { - throw new AbpException("Duplicate permission name detected for " + permission.Name); - } - } - else - { - Permissions[permission.Name] = permission; - } - - //Add child permissions (recursive call) - foreach (var childPermission in permission.Children) - { - AddPermissionRecursively(childPermission); - } + return Groups[name] = new PermissionGroupDefinition(name); } } } \ No newline at end of file diff --git a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinitionManager.cs b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinitionManager.cs index 56527400b5..41250488ec 100644 --- a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinitionManager.cs +++ b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinitionManager.cs @@ -13,8 +13,11 @@ namespace Volo.Abp.Permissions protected List Providers => _lazyProviders.Value; private readonly Lazy> _lazyProviders; + protected IDictionary PermissionGroupDefinitions => _lazyPermissionGroupDefinitions.Value; + private readonly Lazy> _lazyPermissionGroupDefinitions; + protected IDictionary PermissionDefinitions => _lazyPermissionDefinitions.Value; - private readonly Lazy> _lazyPermissionDefinitions; + private readonly Lazy> _lazyPermissionDefinitions; protected PermissionOptions Options { get; } @@ -28,7 +31,8 @@ namespace Volo.Abp.Permissions Options = options.Value; _lazyProviders = new Lazy>(CreatePermissionProviders, true); - _lazyPermissionDefinitions = new Lazy>(CreatePermissionDefinitions, true); + _lazyPermissionDefinitions = new Lazy>(CreatePermissionDefinitions, true); + _lazyPermissionGroupDefinitions = new Lazy>(CreatePermissionGroupDefinitions, true); } public virtual PermissionDefinition Get(string name) @@ -45,11 +49,16 @@ namespace Volo.Abp.Permissions return permission; } - public virtual IReadOnlyList GetAll() + public virtual IReadOnlyList GetPermissions() { return PermissionDefinitions.Values.ToImmutableList(); } + public IReadOnlyList GetGroups() + { + return PermissionGroupDefinitions.Values.ToImmutableList(); + } + public virtual PermissionDefinition GetOrNull(string name) { return PermissionDefinitions.GetOrDefault(name); @@ -63,17 +72,46 @@ namespace Volo.Abp.Permissions .ToList(); } - protected virtual IDictionary CreatePermissionDefinitions() + protected virtual Dictionary CreatePermissionDefinitions() + { + var permissions = new Dictionary(); + + foreach (var groupDefinition in PermissionGroupDefinitions.Values) + { + foreach (var permission in groupDefinition.Permissions) + { + AddPermissionToDictionaryRecursively(permissions, permission); + } + } + + return permissions; + } + + protected virtual void AddPermissionToDictionaryRecursively(Dictionary permissions, PermissionDefinition permission) + { + if (permissions.ContainsKey(permission.Name)) + { + throw new AbpException("Duplicate permission name: " + permission.Name); + } + + permissions[permission.Name] = permission; + + foreach (var child in permission.Children) + { + AddPermissionToDictionaryRecursively(permissions, child); + } + } + + protected virtual Dictionary CreatePermissionGroupDefinitions() { var context = new PermissionDefinitionContext(); foreach (var provider in Providers) { provider.Define(context); - context.HandleNewChildren(); } - return context.Permissions; + return context.Groups; } } } \ No newline at end of file diff --git a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinitionProvider.cs b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinitionProvider.cs index 61b85d6b54..43f8ebe146 100644 --- a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinitionProvider.cs +++ b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinitionProvider.cs @@ -1,8 +1,6 @@ -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Permissions +namespace Volo.Abp.Permissions { - public abstract class PermissionDefinitionProvider : IPermissionDefinitionProvider, ISingletonDependency + public abstract class PermissionDefinitionProvider : IPermissionDefinitionProvider { public abstract void Define(IPermissionDefinitionContext context); } diff --git a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionGroupDefinition.cs b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionGroupDefinition.cs new file mode 100644 index 0000000000..5ac8cb16c9 --- /dev/null +++ b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionGroupDefinition.cs @@ -0,0 +1,76 @@ +using System.Collections.Generic; +using System.Collections.Immutable; + +namespace Volo.Abp.Permissions +{ + public class PermissionGroupDefinition //TODO: Consider to make possible a group have sub groups + { + /// + /// Unique name of the group. + /// + public string Name { get; } + + public Dictionary Properties { get; } + + public IReadOnlyList Permissions => _permissions.ToImmutableList(); + private readonly List _permissions; + + /// + /// Gets/sets a key-value on the . + /// + /// Name of the property + /// + /// Returns the value in the dictionary by given . + /// Returns null if given is not present in the dictionary. + /// + public object this[string name] + { + get => Properties.GetOrDefault(name); + set => Properties[name] = value; + } + + protected internal PermissionGroupDefinition(string name) + { + Name = name; + + Properties = new Dictionary(); + _permissions = new List(); + } + + public virtual PermissionDefinition AddPermission(string name) + { + var permission = new PermissionDefinition(name); + + _permissions.Add(permission); + + return permission; + } + + public virtual List GetPermissionsWithChildren() + { + var permissions = new List(); + + foreach (var permission in _permissions) + { + AddPermissionToListRecursively(permissions, permission); + } + + return permissions; + } + + private void AddPermissionToListRecursively(List permissions, PermissionDefinition permission) + { + permissions.Add(permission); + + foreach (var child in permission.Children) + { + AddPermissionToListRecursively(permissions, child); + } + } + + public override string ToString() + { + return $"[{nameof(PermissionGroupDefinition)} {Name}]"; + } + } +} \ No newline at end of file diff --git a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/TestPermissionDefinitionProvider.cs b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/TestPermissionDefinitionProvider.cs index c143a2e3c9..66de8e80f3 100644 --- a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/TestPermissionDefinitionProvider.cs +++ b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/TestPermissionDefinitionProvider.cs @@ -4,9 +4,11 @@ { public override void Define(IPermissionDefinitionContext context) { - context.Add("MyPermission1"); + var testGroup = context.AddGroup("TestGroup"); - var myPermission2 = context.Add("MyPermission2"); + testGroup.AddPermission("MyPermission1"); + + var myPermission2 = testGroup.AddPermission("MyPermission2"); myPermission2.AddChild("MyPermission2.ChildPermission1"); } }