Browse Source

Seperated permission checker and manager

pull/208/head
Halil İbrahim Kalkan 9 years ago
parent
commit
fd03ca3604
  1. 1
      src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj
  2. 4
      src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs
  3. 32
      src/Volo.Abp.Identity.Domain/Volo/Abp/Permissions/UserPermissionManagerExtensions.cs
  4. 17
      src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/IPermissionManager.cs
  5. 8
      src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionGrant.cs
  6. 85
      src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionManager.cs
  7. 32
      src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionStore.cs
  8. 13
      src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionChecker.cs
  9. 21
      src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionManager.cs
  10. 9
      src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionStore.cs
  11. 6
      src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionValueProvider.cs
  12. 19
      src/Volo.Abp.Permissions/Volo/Abp/Permissions/NullPermissionStore.cs
  13. 77
      src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionChecker.cs
  14. 168
      src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionManager.cs
  15. 8
      src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionValueProvider.cs
  16. 41
      src/Volo.Abp.Session/Volo/Abp/Permissions/UserPermissionManagerExtensions.cs
  17. 71
      src/Volo.Abp.Session/Volo/Abp/Session/UserPermissionValueProvider.cs
  18. 12
      test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_Basic_Tests.cs
  19. 100
      test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_User_Tests.cs

1
src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj

@ -16,6 +16,7 @@
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Ddd\Volo.Abp.Ddd.csproj" />
<ProjectReference Include="..\Volo.Abp.Identity.Domain.Shared\Volo.Abp.Identity.Domain.Shared.csproj" />
<ProjectReference Include="..\Volo.Abp.Permissions.Domain\Volo.Abp.Permissions.Domain.csproj" />
</ItemGroup>
<ItemGroup>

4
src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs

@ -1,10 +1,12 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
using Volo.Abp.Permissions;
namespace Volo.Abp.Identity
{
[DependsOn(typeof(AbpIdentityDomainSharedModule))]
[DependsOn(typeof(AbpPermissionsDomainModule))]
[DependsOn(typeof(AbpDddModule))]
[DependsOn(typeof(AbpIdentityDomainSharedModule))]
public class AbpIdentityDomainModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)

32
src/Volo.Abp.Identity.Domain/Volo/Abp/Permissions/UserPermissionManagerExtensions.cs

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using JetBrains.Annotations;
namespace Volo.Abp.Permissions
{
public static class UserPermissionManagerExtensions
{
private const string ProviderName = "User"; //TODO: Share same const with UserPermissionValueProvider
public static Task<bool> IsGrantedForUserAsync(this IPermissionManager permissionManager, [NotNull] string name, Guid userId)
{
return permissionManager.IsGrantedAsync(name, ProviderName, userId.ToString());
}
public static Task<List<string>> GetAllGrantedForUserAsync(this IPermissionManager permissionManager, Guid userId)
{
return permissionManager.GetAllGrantedAsync(ProviderName, userId.ToString());
}
public static Task GrantForUserAsync(this IPermissionManager permissionManager, Guid userId, [NotNull] string name)
{
return permissionManager.GrantAsync(name, ProviderName, userId.ToString());
}
public static Task RevokeForUserAsync(this IPermissionManager permissionManager, Guid userId, [NotNull] string name)
{
return permissionManager.RevokeAsync(name, ProviderName, userId.ToString());
}
}
}

17
src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/IPermissionManager.cs

@ -0,0 +1,17 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using JetBrains.Annotations;
namespace Volo.Abp.Permissions
{
public interface IPermissionManager
{
Task<bool> IsGrantedAsync([NotNull]string name, [NotNull] string providerName, [NotNull] string providerKey);
Task<List<string>> GetAllGrantedAsync([NotNull] string providerName, [NotNull] string providerKey);
Task GrantAsync( [NotNull] string providerName, [NotNull] string providerKey, [NotNull] string name);
Task RevokeAsync([NotNull] string name, [NotNull] string providerName, [NotNull] string providerKey);
}
}

8
src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionGrant.cs

@ -9,10 +9,10 @@ namespace Volo.Abp.Permissions
[NotNull]
public virtual string Name { get; protected set; }
[CanBeNull]
[NotNull]
public virtual string ProviderName { get; protected set; }
[CanBeNull]
[NotNull]
public virtual string ProviderKey { get; protected set; }
protected PermissionGrant()
@ -23,8 +23,8 @@ namespace Volo.Abp.Permissions
public PermissionGrant(
Guid id,
[NotNull] string name,
[CanBeNull] string providerName = null,
[CanBeNull] string providerKey = null)
[NotNull] string providerName ,
[NotNull] string providerKey)
{
Check.NotNull(name, nameof(name));

85
src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionManager.cs

@ -0,0 +1,85 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids;
namespace Volo.Abp.Permissions
{
public class PermissionManager : IPermissionManager, ISingletonDependency
{
protected IPermissionGrantRepository PermissionGrantRepository { get; }
protected IPermissionDefinitionManager PermissionDefinitionManager { get; }
protected IGuidGenerator GuidGenerator { get; }
public PermissionManager(
IPermissionDefinitionManager permissionDefinitionManager,
IPermissionGrantRepository permissionGrantRepository,
IGuidGenerator guidGenerator)
{
GuidGenerator = guidGenerator;
PermissionGrantRepository = permissionGrantRepository;
PermissionDefinitionManager = permissionDefinitionManager;
}
public async Task<bool> IsGrantedAsync(string providerName, string providerKey, string name)
{
Check.NotNull(providerName, nameof(providerName));
Check.NotNull(providerKey, nameof(providerKey));
Check.NotNull(name, nameof(name));
return await PermissionGrantRepository.FindAsync(name, providerName, providerKey) != null;
}
public async Task<List<string>> GetAllGrantedAsync(string providerName, string providerKey)
{
Check.NotNull(providerName, nameof(providerName));
Check.NotNull(providerKey, nameof(providerKey));
return (await PermissionGrantRepository.GetListAsync(providerName, providerKey))
.Select(p => p.Name)
.ToList();
}
public async Task GrantAsync(string providerName, string providerKey, string name)
{
Check.NotNull(providerName, nameof(providerName));
Check.NotNull(providerKey, nameof(providerKey));
Check.NotNull(name, nameof(name));
if (await IsGrantedAsync(providerName, providerKey, name))
{
return;
}
await PermissionGrantRepository.InsertAsync(
new PermissionGrant(
GuidGenerator.Create(),
name,
providerName,
providerKey
)
);
}
public async Task RevokeAsync(string providerName, string providerKey, string name)
{
Check.NotNull(providerName, nameof(providerName));
Check.NotNull(providerKey, nameof(providerKey));
Check.NotNull(name, nameof(name));
if (await IsGrantedAsync(providerName, providerKey, name))
{
return;
}
var grant = await PermissionGrantRepository.FindAsync(name, providerName, providerKey);
if (grant == null)
{
return;
}
await PermissionGrantRepository.DeleteAsync(grant);
}
}
}

32
src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionStore.cs

@ -1,6 +1,4 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Permissions
@ -18,33 +16,5 @@ namespace Volo.Abp.Permissions
{
return await _permissionGrantRepository.FindAsync(name, providerName, providerKey) != null;
}
public async Task AddAsync(string name, string providerName, string providerKey)
{
var permissionGrant = await _permissionGrantRepository.FindAsync(name, providerName, providerKey);
if (permissionGrant != null)
{
return;
}
await _permissionGrantRepository.InsertAsync(
new PermissionGrant(GuidGenerator.Create(), name, providerName, providerKey)
);
}
public async Task<List<string>> GetAllGrantedAsync(string providerName, string providerKey)
{
var permissionGrants = await _permissionGrantRepository.GetListAsync(providerName, providerKey);
return permissionGrants.Select(s => s.Name).ToList();
}
public async Task RemoveAsync(string name, string providerName, string providerKey)
{
var permissionGrant = await _permissionGrantRepository.FindAsync(name, providerName, providerKey);
if (permissionGrant != null)
{
await _permissionGrantRepository.DeleteAsync(permissionGrant);
}
}
}
}

13
src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionChecker.cs

@ -0,0 +1,13 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using JetBrains.Annotations;
namespace Volo.Abp.Permissions
{
public interface IPermissionChecker
{
Task<bool> IsGrantedAsync([NotNull]string name);
Task<List<PermissionGrantInfo>> GetAllAsync();
}
}

21
src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionManager.cs

@ -1,21 +0,0 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using JetBrains.Annotations;
namespace Volo.Abp.Permissions
{
//TODO: Change fallback to inherit?
public interface IPermissionManager
{
Task<bool> IsGrantedAsync([NotNull]string name);
Task<bool> IsGrantedAsync([NotNull]string name, [NotNull] string providerName, [CanBeNull] string providerKey, bool fallback = true);
Task<List<PermissionGrantInfo>> GetAllAsync();
Task<List<PermissionGrantInfo>> GetAllAsync([NotNull] string providerName, [CanBeNull] string providerKey, bool fallback = true);
Task SetAsync([NotNull] string name, bool isGranted, [NotNull] string providerName, [CanBeNull] string providerKey, bool forceToSet = false);
}
}

9
src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionStore.cs

@ -1,5 +1,4 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Threading.Tasks;
using JetBrains.Annotations;
namespace Volo.Abp.Permissions
@ -7,11 +6,5 @@ namespace Volo.Abp.Permissions
public interface IPermissionStore
{
Task<bool> IsGrantedAsync([NotNull] string name, [CanBeNull] string providerName, [CanBeNull] string providerKey);
Task<List<string>> GetAllGrantedAsync([CanBeNull] string providerName, [CanBeNull] string providerKey);
Task AddAsync([NotNull] string name, [CanBeNull] string providerName, [CanBeNull] string providerKey);
Task RemoveAsync([NotNull] string name, [CanBeNull]string providerName, [CanBeNull]string providerKey);
}
}

6
src/Volo.Abp.Permissions/Volo/Abp/Permissions/IPermissionValueProvider.cs

@ -7,10 +7,10 @@ namespace Volo.Abp.Permissions
{
string Name { get; }
Task<bool?> IsGrantedAsync([NotNull] PermissionDefinition permission, [CanBeNull] string providerName, [CanBeNull] string providerKey);
//Task SetAsync([NotNull] PermissionDefinition permission, bool isGranted, [CanBeNull] string providerKey);
Task SetAsync([NotNull] PermissionDefinition permission, bool isGranted, [CanBeNull] string providerKey);
//Task ClearAsync([NotNull] PermissionDefinition permission, [CanBeNull] string providerKey);
Task ClearAsync([NotNull] PermissionDefinition permission, [CanBeNull] string providerKey);
Task<bool> IsGrantedAsync(PermissionDefinition permission);
}
}

19
src/Volo.Abp.Permissions/Volo/Abp/Permissions/NullPermissionStore.cs

@ -1,5 +1,4 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.DependencyInjection;
@ -19,21 +18,5 @@ namespace Volo.Abp.Permissions
{
return Task.FromResult(false);
}
public Task AddAsync(string name, string providerName, string providerKey)
{
Logger.LogWarning($"Setting the grant value for {name} is not possible because current permission store is {nameof(NullPermissionStore)}");
return Task.CompletedTask;
}
public Task<List<string>> GetAllGrantedAsync(string providerName, string providerKey)
{
return Task.FromResult(new List<string>());
}
public Task RemoveAsync(string name, string providerName, string providerKey)
{
return Task.CompletedTask;
}
}
}

77
src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionChecker.cs

@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Permissions
{
public class PermissionChecker : IPermissionChecker, ITransientDependency
{
protected IPermissionDefinitionManager PermissionDefinitionManager { get; }
protected Lazy<List<IPermissionValueProvider>> Providers { get; }
protected PermissionOptions Options { get; }
public PermissionChecker(
IOptions<PermissionOptions> options,
IServiceProvider serviceProvider,
IPermissionDefinitionManager permissionDefinitionManager)
{
PermissionDefinitionManager = permissionDefinitionManager;
Options = options.Value;
Providers = new Lazy<List<IPermissionValueProvider>>(
() => Options
.ValueProviders
.Select(c => serviceProvider.GetRequiredService(c) as IPermissionValueProvider)
.ToList(),
true
);
}
public async Task<bool> IsGrantedAsync(string name)
{
var permission = PermissionDefinitionManager.Get(name);
foreach (var provider in Providers.Value)
{
if (await provider.IsGrantedAsync(permission))
{
return true;
}
}
return false;
}
public virtual async Task<List<PermissionGrantInfo>> GetAllAsync()
{
var permissionDefinitions = PermissionDefinitionManager.GetAll();
var permissionGrantInfos = new Dictionary<string, PermissionGrantInfo>();
foreach (var permission in permissionDefinitions)
{
permissionGrantInfos[permission.Name] = await GetPermissionGrantInfo(permission);
}
return permissionGrantInfos.Values.ToList();
}
private async Task<PermissionGrantInfo> GetPermissionGrantInfo(PermissionDefinition permission)
{
foreach (var provider in Providers.Value)
{
if (await provider.IsGrantedAsync(permission))
{
return new PermissionGrantInfo(permission.Name, true, provider.Name);
}
}
return new PermissionGrantInfo(permission.Name, false);
}
}
}

168
src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionManager.cs

@ -1,168 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Permissions
{
public class PermissionManager : IPermissionManager, ISingletonDependency
{
protected IPermissionDefinitionManager PermissionDefinitionManager { get; }
protected Lazy<List<IPermissionValueProvider>> Providers { get; }
protected PermissionOptions Options { get; }
protected IPermissionStore PermissionStore { get; }
public PermissionManager(
IOptions<PermissionOptions> options,
IServiceProvider serviceProvider,
IPermissionDefinitionManager permissionDefinitionManager,
IPermissionStore permissionStore)
{
PermissionStore = permissionStore;
PermissionDefinitionManager = permissionDefinitionManager;
Options = options.Value;
Providers = new Lazy<List<IPermissionValueProvider>>(
() => Options
.ValueProviders
.Select(c => serviceProvider.GetRequiredService(c) as IPermissionValueProvider)
.ToList(),
true
);
}
public virtual Task<bool> IsGrantedAsync(string name)
{
Check.NotNull(name, nameof(name));
return IsGrantedInternalAsync(name, null, null);
}
public virtual Task<bool> IsGrantedAsync(string name, string providerName, string providerKey, bool fallback = true)
{
Check.NotNull(name, nameof(name));
Check.NotNull(providerName, nameof(providerName));
return IsGrantedInternalAsync(name, providerName, providerKey);
}
public virtual async Task<bool> IsGrantedInternalAsync(string name, string providerName, string providerKey, bool fallback = true)
{
var permission = PermissionDefinitionManager.Get(name);
var providers = Enumerable
.Reverse(Providers.Value);
if (providerName != null)
{
providers = providers.SkipWhile(c => c.Name != providerName);
}
if (!fallback)
{
providers = providers.TakeWhile(c => c.Name == providerName);
}
foreach (var provider in providers)
{
var value = await provider.IsGrantedAsync(permission, providerName, providerKey);
if (value != null)
{
return value.Value;
}
}
return false;
}
public virtual Task<List<PermissionGrantInfo>> GetAllAsync()
{
return GetAllFromProvidersAsync(Providers.Value, null);
}
public virtual async Task<List<PermissionGrantInfo>> GetAllAsync(string providerName, string providerKey, bool fallback = true)
{
Check.NotNull(providerName, nameof(providerName));
var providers = Enumerable.Reverse(Providers.Value)
.SkipWhile(c => c.Name != providerName);
if (!fallback)
{
providers = providers.TakeWhile(c => c.Name == providerName);
}
var providerList = providers.Reverse().ToList();
return await GetAllFromProvidersAsync(providerList, providerKey);
}
public virtual async Task SetAsync(string name, bool isGranted, string providerName, string providerKey, bool forceToSet = false)
{
Check.NotNull(name, nameof(name));
Check.NotNull(providerName, nameof(providerName));
var permission = PermissionDefinitionManager.Get(name);
var providers = Enumerable
.Reverse(Providers.Value)
.SkipWhile(p => p.Name != providerName)
.ToList();
if (!providers.Any())
{
return;
}
if (providers.Count > 1 && !forceToSet)
{
//Clear the value if it's same as it's fallback value
var fallbackValue = await IsGrantedInternalAsync(name, providers[1].Name, providerKey);
if (fallbackValue == isGranted)
{
return;
}
}
providers = providers
.TakeWhile(p => p.Name == providerName)
.ToList(); //Getting list for case of there are more than one provider with same name
foreach (var provider in providers)
{
await provider.SetAsync(permission, isGranted, providerKey);
}
}
protected virtual async Task<List<PermissionGrantInfo>> GetAllFromProvidersAsync(
[NotNull] List<IPermissionValueProvider> providers,
[CanBeNull] string providerKey)
{
var permissionDefinitions = PermissionDefinitionManager.GetAll();
var permissionGrantInfos = new Dictionary<string, PermissionGrantInfo>();
foreach (var permission in permissionDefinitions)
{
permissionGrantInfos[permission.Name] = new PermissionGrantInfo(permission.Name, false);
foreach (var provider in providers)
{
var value = await provider.IsGrantedAsync(permission, provider.Name, providerKey);
if (value != null)
{
permissionGrantInfos[permission.Name] =
new PermissionGrantInfo(permission.Name, value.Value, provider.Name);
}
}
}
return permissionGrantInfos.Values.ToList();
}
}
}

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

@ -22,10 +22,12 @@ namespace Volo.Abp.Permissions
PermissionStore = permissionStore;
}
public abstract Task<bool?> IsGrantedAsync(PermissionDefinition permission, string providerName, string providerKey);
//public abstract Task<bool?> IsGrantedAsync(PermissionDefinition permission, string providerName, string providerKey);
public abstract Task SetAsync(PermissionDefinition permission, bool isGranted, string providerKey);
//public abstract Task SetAsync(PermissionDefinition permission, bool isGranted, string providerKey);
public abstract Task ClearAsync(PermissionDefinition permission, string providerKey);
//public abstract Task ClearAsync(PermissionDefinition permission, string providerKey);
public abstract Task<bool> IsGrantedAsync(PermissionDefinition permission);
}
}

41
src/Volo.Abp.Session/Volo/Abp/Permissions/UserPermissionManagerExtensions.cs

@ -1,41 +0,0 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Session;
namespace Volo.Abp.Permissions
{
public static class UserPermissionManagerExtensions
{
public static Task<bool> IsGrantedForUserAsync(this IPermissionManager permissionManager, [NotNull] string name, Guid userId, bool fallback = true)
{
return permissionManager.IsGrantedAsync(name, UserPermissionValueProvider.ProviderName, userId.ToString(), fallback);
}
public static Task<bool> IsGrantedForCurrentUserAsync(this IPermissionManager permissionManager, [NotNull] string name, bool fallback = true)
{
return permissionManager.IsGrantedAsync(name, UserPermissionValueProvider.ProviderName, null, fallback);
}
public static Task<List<PermissionGrantInfo>> GetAllForUserAsync(this IPermissionManager permissionManager, Guid userId, bool fallback = true)
{
return permissionManager.GetAllAsync(UserPermissionValueProvider.ProviderName, userId.ToString(), fallback);
}
public static Task<List<PermissionGrantInfo>> GetAllForCurrentUserAsync(this IPermissionManager permissionManager, bool fallback = true)
{
return permissionManager.GetAllAsync(UserPermissionValueProvider.ProviderName, null, fallback);
}
public static Task SetForUserAsync(this IPermissionManager permissionManager, Guid userId, [NotNull] string name, bool isGranted, bool forceToSet = false)
{
return permissionManager.SetAsync(name, isGranted, UserPermissionValueProvider.ProviderName, userId.ToString(), forceToSet);
}
public static Task SetForCurrentUserAsync(this IPermissionManager permissionManager, [NotNull] string name, bool isGranted, bool forceToSet = false)
{
return permissionManager.SetAsync(name, isGranted, UserPermissionValueProvider.ProviderName, null, forceToSet);
}
}
}

71
src/Volo.Abp.Session/Volo/Abp/Session/UserPermissionValueProvider.cs

@ -1,6 +1,4 @@
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
using Volo.Abp.Permissions;
namespace Volo.Abp.Session
@ -19,73 +17,14 @@ namespace Volo.Abp.Session
CurrentUser = currentUser;
}
public override async Task<bool?> IsGrantedAsync(PermissionDefinition permission, string providerName, string providerKey)
public override async Task<bool> IsGrantedAsync(PermissionDefinition permission)
{
var userId = ParseOrGetCurrentUser(providerName, providerKey);
if (userId == null)
if (CurrentUser.Id == null)
{
return null;
return false;
}
return await PermissionStore.IsGrantedAsync(permission.Name, Name, userId.ToString());
}
protected virtual Guid? ParseOrGetCurrentUser(string providerName, string providerKey)
{
if (providerName == null)
{
return CurrentUser.Id;
}
if (providerName == Name)
{
if (providerKey == null)
{
return CurrentUser.Id;
}
if (!Guid.TryParse(providerKey, out var result))
{
throw new AbpException("UserId should be a Guid!");
}
return result;
}
return null;
}
public override Task SetAsync(PermissionDefinition permission, bool isGranted, string providerKey)
{
var userId = ParseOrGetCurrentUser(Name, providerKey);
if (userId == null)
{
Logger.LogWarning($"Could not set the permission '{permission}' because the user id is not available!");
return Task.CompletedTask;
}
//TODO: Seperate SetAsync to AddGrant / RemoveGrant
if (isGranted)
{
return PermissionStore.AddAsync(permission.Name, Name, userId.ToString());
}
else
{
return PermissionStore.RemoveAsync(permission.Name, Name, userId.ToString());
}
}
public override Task ClearAsync(PermissionDefinition permission, string providerKey)
{
var userId = ParseOrGetCurrentUser(Name, providerKey);
if (userId == null)
{
Logger.LogWarning($"Could not clear the permission '{permission}' because the user id is not available!");
return Task.CompletedTask;
}
return PermissionStore.RemoveAsync(permission.Name, Name, providerKey);
return await PermissionStore.IsGrantedAsync(permission.Name, Name, CurrentUser.Id.Value.ToString());
}
}
}

12
test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_Basic_Tests.cs

@ -4,27 +4,27 @@ using Xunit;
namespace Volo.Abp.Permissions
{
public class PermissionManager_Basic_Tests : PermissionTestBase
public class PermissionChecker_Basic_Tests : PermissionTestBase
{
private readonly IPermissionManager _permissionManager;
private readonly IPermissionChecker _permissionChecker;
public PermissionManager_Basic_Tests()
public PermissionChecker_Basic_Tests()
{
_permissionManager = GetRequiredService<IPermissionManager>();
_permissionChecker = GetRequiredService<IPermissionChecker>();
}
[Fact]
public async Task Should_Throw_Exception_If_Permission_Is_Not_Defined()
{
await Assert.ThrowsAsync<AbpException>(async () =>
await _permissionManager.IsGrantedAsync("UndefinedPermissionName")
await _permissionChecker.IsGrantedAsync("UndefinedPermissionName")
);
}
[Fact]
public async Task Should_Return_False_As_Default_For_Any_Permission()
{
(await _permissionManager.IsGrantedAsync("MyPermission1")).ShouldBeFalse();
(await _permissionChecker.IsGrantedAsync("MyPermission1")).ShouldBeFalse();
}
}
}

100
test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_User_Tests.cs

@ -10,13 +10,13 @@ namespace Volo.Abp.Permissions
{
public class PermissionManager_User_Tests : PermissionTestBase
{
private readonly IPermissionManager _permissionManager;
private readonly IPermissionChecker _permissionChecker;
private Guid? _currentUserId;
public PermissionManager_User_Tests()
{
_permissionManager = GetRequiredService<IPermissionManager>();
_permissionChecker = GetRequiredService<IPermissionChecker>();
}
protected override void AfterAddApplication(IServiceCollection services)
@ -26,40 +26,40 @@ namespace Volo.Abp.Permissions
services.AddSingleton(currentUser);
}
[Fact]
public async Task Should_Return_True_For_Granted_User()
{
(await _permissionManager.IsGrantedForUserAsync(
"MyPermission1",
PermissionTestDataBuilder.User1Id
)).ShouldBeTrue();
}
//[Fact]
//public async Task Should_Return_True_For_Granted_User()
//{
// (await _permissionManager.IsGrantedForUserAsync(
// "MyPermission1",
// PermissionTestDataBuilder.User1Id
// )).ShouldBeTrue();
//}
[Fact]
public async Task Should_Return_True_For_Granted_Current_User()
{
_currentUserId = PermissionTestDataBuilder.User1Id;
(await _permissionManager.IsGrantedForCurrentUserAsync(
(await _permissionChecker.IsGrantedAsync(
"MyPermission1"
)).ShouldBeTrue();
}
[Fact]
public async Task Should_Return_False_For_Non_Granted_User()
{
(await _permissionManager.IsGrantedForUserAsync(
"MyPermission1",
PermissionTestDataBuilder.User2Id
)).ShouldBeFalse();
}
//[Fact]
//public async Task Should_Return_False_For_Non_Granted_User()
//{
// (await _permissionManager.IsGrantedForUserAsync(
// "MyPermission1",
// PermissionTestDataBuilder.User2Id
// )).ShouldBeFalse();
//}
[Fact]
public async Task Should_Return_False_For_Non_Granted_Current_User()
{
_currentUserId = PermissionTestDataBuilder.User2Id;
(await _permissionManager.IsGrantedForCurrentUserAsync(
(await _permissionChecker.IsGrantedAsync(
"MyPermission1"
)).ShouldBeFalse();
}
@ -67,55 +67,55 @@ namespace Volo.Abp.Permissions
[Fact]
public async Task Should_Return_False_For_Current_User_If_Anonymous()
{
(await _permissionManager.IsGrantedForCurrentUserAsync(
(await _permissionChecker.IsGrantedAsync(
"MyPermission1"
)).ShouldBeFalse();
}
[Fact]
public async Task Should_Get_List_Of_Granted_Permissions_For_A_User()
{
//User1
var permission = await _permissionManager.GetAllForUserAsync(PermissionTestDataBuilder.User1Id);
permission.Count.ShouldBeGreaterThan(0);
permission.ShouldContain(p => p.Name == "MyPermission1" && p.IsGranted && p.ProviderName == UserPermissionValueProvider.ProviderName);
//[Fact]
//public async Task Should_Get_List_Of_Granted_Permissions_For_A_User()
//{
// //User1
// var permission = await _permissionManager.GetAllForUserAsync(PermissionTestDataBuilder.User1Id);
// permission.Count.ShouldBeGreaterThan(0);
// permission.ShouldContain(p => p.Name == "MyPermission1" && p.IsGranted && p.ProviderName == UserPermissionValueProvider.ProviderName);
//User2
permission = await _permissionManager.GetAllForUserAsync(PermissionTestDataBuilder.User2Id);
permission.Count.ShouldBeGreaterThan(0);
permission.ShouldContain(p => p.Name == "MyPermission1" && !p.IsGranted);
}
// //User2
// permission = await _permissionManager.GetAllForUserAsync(PermissionTestDataBuilder.User2Id);
// permission.Count.ShouldBeGreaterThan(0);
// permission.ShouldContain(p => p.Name == "MyPermission1" && !p.IsGranted);
//}
[Fact]
public async Task Should_Get_List_Of_Granted_Permissions_For_Current_User()
{
//User1
_currentUserId = PermissionTestDataBuilder.User1Id;
var permission = await _permissionManager.GetAllForCurrentUserAsync();
var permission = await _permissionChecker.GetAllAsync();
permission.Count.ShouldBeGreaterThan(0);
permission.ShouldContain(p => p.Name == "MyPermission1" && p.IsGranted && p.ProviderName == UserPermissionValueProvider.ProviderName);
//User2
_currentUserId = PermissionTestDataBuilder.User2Id;
permission = await _permissionManager.GetAllForCurrentUserAsync();
permission = await _permissionChecker.GetAllAsync();
permission.Count.ShouldBeGreaterThan(0);
permission.ShouldContain(p => p.Name == "MyPermission1" && !p.IsGranted);
}
[Fact]
public async Task Should_Grant_Permission_For_A_User()
{
(await _permissionManager.IsGrantedForUserAsync(
"MyPermission1",
PermissionTestDataBuilder.User2Id
)).ShouldBeFalse();
await _permissionManager.SetForUserAsync(PermissionTestDataBuilder.User2Id, "MyPermission1", true);
(await _permissionManager.IsGrantedForUserAsync(
"MyPermission1",
PermissionTestDataBuilder.User2Id
)).ShouldBeTrue();
}
//[Fact]
//public async Task Should_Grant_Permission_For_A_User()
//{
// (await _permissionManager.IsGrantedForUserAsync(
// "MyPermission1",
// PermissionTestDataBuilder.User2Id
// )).ShouldBeFalse();
// await _permissionManager.SetForUserAsync(PermissionTestDataBuilder.User2Id, "MyPermission1", true);
// (await _permissionManager.IsGrantedForUserAsync(
// "MyPermission1",
// PermissionTestDataBuilder.User2Id
// )).ShouldBeTrue();
//}
}
}

Loading…
Cancel
Save