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> <ItemGroup>
<ProjectReference Include="..\Volo.Abp.Ddd\Volo.Abp.Ddd.csproj" /> <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.Identity.Domain.Shared\Volo.Abp.Identity.Domain.Shared.csproj" />
<ProjectReference Include="..\Volo.Abp.Permissions.Domain\Volo.Abp.Permissions.Domain.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

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

@ -1,10 +1,12 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Permissions;
namespace Volo.Abp.Identity namespace Volo.Abp.Identity
{ {
[DependsOn(typeof(AbpIdentityDomainSharedModule))] [DependsOn(typeof(AbpPermissionsDomainModule))]
[DependsOn(typeof(AbpDddModule))] [DependsOn(typeof(AbpDddModule))]
[DependsOn(typeof(AbpIdentityDomainSharedModule))]
public class AbpIdentityDomainModule : AbpModule public class AbpIdentityDomainModule : AbpModule
{ {
public override void ConfigureServices(IServiceCollection services) 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] [NotNull]
public virtual string Name { get; protected set; } public virtual string Name { get; protected set; }
[CanBeNull] [NotNull]
public virtual string ProviderName { get; protected set; } public virtual string ProviderName { get; protected set; }
[CanBeNull] [NotNull]
public virtual string ProviderKey { get; protected set; } public virtual string ProviderKey { get; protected set; }
protected PermissionGrant() protected PermissionGrant()
@ -23,8 +23,8 @@ namespace Volo.Abp.Permissions
public PermissionGrant( public PermissionGrant(
Guid id, Guid id,
[NotNull] string name, [NotNull] string name,
[CanBeNull] string providerName = null, [NotNull] string providerName ,
[CanBeNull] string providerKey = null) [NotNull] string providerKey)
{ {
Check.NotNull(name, nameof(name)); 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.Threading.Tasks;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Permissions namespace Volo.Abp.Permissions
@ -18,33 +16,5 @@ namespace Volo.Abp.Permissions
{ {
return await _permissionGrantRepository.FindAsync(name, providerName, providerKey) != null; 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; using JetBrains.Annotations;
namespace Volo.Abp.Permissions namespace Volo.Abp.Permissions
@ -7,11 +6,5 @@ namespace Volo.Abp.Permissions
public interface IPermissionStore public interface IPermissionStore
{ {
Task<bool> IsGrantedAsync([NotNull] string name, [CanBeNull] string providerName, [CanBeNull] string providerKey); 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; } 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;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
@ -19,21 +18,5 @@ namespace Volo.Abp.Permissions
{ {
return Task.FromResult(false); 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; 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 System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Volo.Abp.Permissions; using Volo.Abp.Permissions;
namespace Volo.Abp.Session namespace Volo.Abp.Session
@ -19,73 +17,14 @@ namespace Volo.Abp.Session
CurrentUser = currentUser; 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 (CurrentUser.Id == null)
if (userId == null)
{ {
return null; return false;
} }
return await PermissionStore.IsGrantedAsync(permission.Name, Name, userId.ToString()); return await PermissionStore.IsGrantedAsync(permission.Name, Name, CurrentUser.Id.Value.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);
} }
} }
} }

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

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

Loading…
Cancel
Save