Browse Source

Permission system enhancements.

pull/208/head
Halil İbrahim Kalkan 9 years ago
parent
commit
dbbe2545f1
  1. 8
      src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionDefinitionContext.cs
  2. 35
      src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinition.cs
  3. 48
      src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinitionContext.cs
  4. 7
      src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinitionManager.cs
  5. 1
      src/Volo.Abp.Session/Volo/Abp/Session/AbpSessionModule.cs
  6. 39
      src/Volo.Abp.Session/Volo/Abp/Session/RolePermissionValueProvider.cs
  7. 5
      test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/TestPermissionDefinitionProvider.cs

8
src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionDefinitionContext.cs

@ -1,9 +1,11 @@
namespace Volo.Abp.Permissions using JetBrains.Annotations;
namespace Volo.Abp.Permissions
{ {
public interface IPermissionDefinitionContext public interface IPermissionDefinitionContext
{ {
PermissionDefinition GetOrNull(string name); PermissionDefinition GetOrNull([NotNull] string name);
void Add(params PermissionDefinition[] definitions); PermissionDefinition Add([NotNull] string name);
} }
} }

35
src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinition.cs

@ -1,4 +1,7 @@
namespace Volo.Abp.Permissions using System.Collections.Generic;
using System.Collections.Immutable;
namespace Volo.Abp.Permissions
{ {
public class PermissionDefinition public class PermissionDefinition
{ {
@ -13,19 +16,41 @@
/// </summary> /// </summary>
public PermissionDefinition Parent { get; private set; } public PermissionDefinition Parent { get; private set; }
//TODO: Add Properties dictionary for custom stuff public IReadOnlyList<PermissionDefinition> Children => _children.ToImmutableList();
private readonly List<PermissionDefinition> _children;
public Dictionary<string, object> Properties { get; set; }
public PermissionDefinition(string name) /// <summary>
/// Gets/sets a key-value on the <see cref="Properties"/>.
/// </summary>
/// <param name="name">Name of the property</param>
/// <returns>
/// Returns the value in the <see cref="Properties"/> dictionary by given <see cref="name"/>.
/// Returns null if given <see cref="name"/> is not present in the <see cref="Properties"/> dictionary.
/// </returns>
public object this[string name]
{
get => Properties.GetOrDefault(name);
set => Properties[name] = value;
}
protected internal PermissionDefinition(string name)
{ {
Name = name; Name = name;
_children = new List<PermissionDefinition>();
} }
public PermissionDefinition CreateChild(string name) public virtual PermissionDefinition AddChild(string name)
{ {
return new PermissionDefinition(name) var child = new PermissionDefinition(name)
{ {
Parent = this Parent = this
}; };
_children.Add(child);
return child;
} }
public override string ToString() public override string ToString()

48
src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinitionContext.cs

@ -1,19 +1,22 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq;
namespace Volo.Abp.Permissions namespace Volo.Abp.Permissions
{ {
public class PermissionDefinitionContext : IPermissionDefinitionContext public class PermissionDefinitionContext : IPermissionDefinitionContext
{ {
protected Dictionary<string, PermissionDefinition> Permissions { get; } internal Dictionary<string, PermissionDefinition> Permissions { get; }
public PermissionDefinitionContext(Dictionary<string, PermissionDefinition> permissions) public PermissionDefinitionContext()
{ {
Permissions = permissions; Permissions = new Dictionary<string, PermissionDefinition>();
} }
public virtual PermissionDefinition GetOrNull(string name) public virtual PermissionDefinition GetOrNull(string name)
{ {
Check.NotNull(name, nameof(name));
return Permissions.GetOrDefault(name); return Permissions.GetOrDefault(name);
} }
@ -22,16 +25,45 @@ namespace Volo.Abp.Permissions
return Permissions.Values.ToImmutableList(); return Permissions.Values.ToImmutableList();
} }
public virtual void Add(params PermissionDefinition[] definitions) public virtual PermissionDefinition Add(string name)
{ {
if (definitions.IsNullOrEmpty()) Check.NotNull(name, nameof(name));
if (Permissions.ContainsKey(name))
{
throw new AbpException($"There is already an existing permission 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
{ {
return; Permissions[permission.Name] = permission;
} }
foreach (var definition in definitions) //Add child permissions (recursive call)
foreach (var childPermission in permission.Children)
{ {
Permissions[definition.Name] = definition; AddPermissionRecursively(childPermission);
} }
} }
} }

7
src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinitionManager.cs

@ -65,14 +65,15 @@ namespace Volo.Abp.Permissions
protected virtual IDictionary<string, PermissionDefinition> CreatePermissionDefinitions() protected virtual IDictionary<string, PermissionDefinition> CreatePermissionDefinitions()
{ {
var permissions = new Dictionary<string, PermissionDefinition>(); var context = new PermissionDefinitionContext();
foreach (var provider in Providers) foreach (var provider in Providers)
{ {
provider.Define(new PermissionDefinitionContext(permissions)); provider.Define(context);
context.HandleNewChildren();
} }
return permissions; return context.Permissions;
} }
} }
} }

1
src/Volo.Abp.Session/Volo/Abp/Session/AbpSessionModule.cs

@ -21,6 +21,7 @@ namespace Volo.Abp.Session
services.Configure<PermissionOptions>(options => services.Configure<PermissionOptions>(options =>
{ {
options.ValueProviders.Add<UserPermissionValueProvider>(); options.ValueProviders.Add<UserPermissionValueProvider>();
options.ValueProviders.Add<RolePermissionValueProvider>();
}); });
services.AddAssemblyOf<AbpSessionModule>(); services.AddAssemblyOf<AbpSessionModule>();

39
src/Volo.Abp.Session/Volo/Abp/Session/RolePermissionValueProvider.cs

@ -0,0 +1,39 @@
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.Permissions;
namespace Volo.Abp.Session
{
public class RolePermissionValueProvider : PermissionValueProvider
{
public const string ProviderName = "Role";
public override string Name => ProviderName;
protected ICurrentUser CurrentUser { get; }
public RolePermissionValueProvider(IPermissionStore permissionStore, ICurrentUser currentUser)
: base(permissionStore)
{
CurrentUser = currentUser;
}
public override async Task<bool> IsGrantedAsync(PermissionDefinition permission)
{
if (CurrentUser.Id == null || !CurrentUser.Roles.Any())
{
return false;
}
foreach (var role in CurrentUser.Roles)
{
if (await PermissionStore.IsGrantedAsync(permission.Name, Name, role))
{
return true;
}
}
return false;
}
}
}

5
test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/TestPermissionDefinitionProvider.cs

@ -4,9 +4,10 @@
{ {
public override void Define(IPermissionDefinitionContext context) public override void Define(IPermissionDefinitionContext context)
{ {
var myPermission1 = new PermissionDefinition("MyPermission1"); context.Add("MyPermission1");
context.Add(myPermission1); var myPermission2 = context.Add("MyPermission2");
myPermission2.AddChild("MyPermission2.ChildPermission1");
} }
} }
} }
Loading…
Cancel
Save