mirror of https://github.com/abpframework/abp.git
19 changed files with 331 additions and 13 deletions
@ -0,0 +1,9 @@ |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace Volo.Abp.Authorization.Permissions |
|||
{ |
|||
public interface IPermissionStateManager |
|||
{ |
|||
Task<bool> IsEnabledAsync(PermissionDefinition permission); |
|||
} |
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace Volo.Abp.Authorization.Permissions |
|||
{ |
|||
public interface IPermissionStateProvider |
|||
{ |
|||
Task<bool> IsEnabledAsync(PermissionStateContext context); |
|||
} |
|||
} |
|||
@ -0,0 +1,34 @@ |
|||
using System.Collections.Generic; |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Volo.Abp.Authorization.Permissions |
|||
{ |
|||
public static class PermissionDefinitionExtensions |
|||
{ |
|||
public const string PropertyName = "_AbpPermissionStateProviders"; |
|||
|
|||
public static PermissionDefinition AddStateProvider( |
|||
[NotNull] this PermissionDefinition permissionDefinition, |
|||
[NotNull] params IPermissionStateProvider[] permissionStateProviders) |
|||
{ |
|||
var stateProviders = permissionDefinition.GetStateProvidersInternal(); |
|||
|
|||
foreach (var provider in permissionStateProviders) |
|||
{ |
|||
stateProviders.AddIfNotContains(provider); |
|||
} |
|||
|
|||
return permissionDefinition; |
|||
} |
|||
|
|||
public static IReadOnlyList<IPermissionStateProvider> GetStateProviders([NotNull] this PermissionDefinition permissionDefinition) |
|||
{ |
|||
return permissionDefinition.GetStateProvidersInternal(); |
|||
} |
|||
|
|||
private static List<IPermissionStateProvider> GetStateProvidersInternal([NotNull] this PermissionDefinition permissionDefinition) |
|||
{ |
|||
return (List<IPermissionStateProvider>) permissionDefinition.Properties.GetOrAdd(PropertyName, () => new List<IPermissionStateProvider>()); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
using System; |
|||
|
|||
namespace Volo.Abp.Authorization.Permissions |
|||
{ |
|||
public class PermissionStateContext |
|||
{ |
|||
public IServiceProvider ServiceProvider { get; set; } |
|||
|
|||
public PermissionDefinition Permission { get; set; } |
|||
} |
|||
} |
|||
@ -0,0 +1,55 @@ |
|||
using System; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Microsoft.Extensions.Options; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace Volo.Abp.Authorization.Permissions |
|||
{ |
|||
public class PermissionStateManager : IPermissionStateManager, ITransientDependency |
|||
{ |
|||
protected IServiceProvider ServiceProvider { get; } |
|||
protected AbpPermissionOptions Options { get; } |
|||
|
|||
public PermissionStateManager(IServiceProvider serviceProvider, IOptions<AbpPermissionOptions> options) |
|||
{ |
|||
ServiceProvider = serviceProvider; |
|||
Options = options.Value; |
|||
} |
|||
|
|||
public async Task<bool> IsEnabledAsync(PermissionDefinition permission) |
|||
{ |
|||
using (var scope = ServiceProvider.CreateScope()) |
|||
{ |
|||
var context = new PermissionStateContext |
|||
{ |
|||
Permission = permission, |
|||
ServiceProvider = scope.ServiceProvider |
|||
}; |
|||
|
|||
var providers = permission.GetStateProviders(); |
|||
if (providers != null && providers.Any()) |
|||
{ |
|||
foreach (var provider in providers) |
|||
{ |
|||
if (!await provider.IsEnabledAsync(context)) |
|||
{ |
|||
return false; |
|||
} |
|||
} |
|||
} |
|||
|
|||
foreach (IPermissionStateProvider provider in Options.GlobalStateProviders.Select(x => ServiceProvider.GetRequiredService(x))) |
|||
{ |
|||
if (!await provider.IsEnabledAsync(context)) |
|||
{ |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,63 @@ |
|||
using System; |
|||
using System.Security.Claims; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Shouldly; |
|||
using Volo.Abp.Authorization.Permissions; |
|||
using Volo.Abp.Security.Claims; |
|||
using Xunit; |
|||
|
|||
namespace Volo.Abp.Authorization |
|||
{ |
|||
public abstract class PermissionStateProvider_Tests : AuthorizationTestBase |
|||
{ |
|||
protected IPermissionStateManager PermissionStateManager { get; } |
|||
protected IPermissionDefinitionManager PermissionDefinitionManager { get; } |
|||
protected ICurrentPrincipalAccessor CurrentPrincipalAccessor { get; } |
|||
|
|||
public PermissionStateProvider_Tests() |
|||
{ |
|||
PermissionStateManager = GetRequiredService<IPermissionStateManager>(); |
|||
PermissionDefinitionManager = GetRequiredService<IPermissionDefinitionManager>(); |
|||
CurrentPrincipalAccessor = GetRequiredService<ICurrentPrincipalAccessor>(); |
|||
} |
|||
} |
|||
|
|||
public class SpecifyPermissionStateProvider : PermissionStateProvider_Tests |
|||
{ |
|||
[Fact] |
|||
public async Task PermissionState_Test() |
|||
{ |
|||
var myPermission1 = PermissionDefinitionManager.Get("MyPermission1"); |
|||
myPermission1.GetStateProviders().ShouldContain(x => x.GetType() == typeof(TestRequireEditionPermissionStateProvider)); |
|||
|
|||
(await PermissionStateManager.IsEnabledAsync(myPermission1)).ShouldBeFalse(); |
|||
|
|||
using (CurrentPrincipalAccessor.Change(new Claim(AbpClaimTypes.EditionId, Guid.NewGuid().ToString()))) |
|||
{ |
|||
(await PermissionStateManager.IsEnabledAsync(myPermission1)).ShouldBeTrue(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
public class GlobalPermissionStateProvider : PermissionStateProvider_Tests |
|||
{ |
|||
protected override void AfterAddApplication(IServiceCollection services) |
|||
{ |
|||
services.Configure<AbpPermissionOptions>(options => options.GlobalStateProviders.Add<TestGlobalRequireRolePermissionStateProvider>()); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Global_PermissionState_Test() |
|||
{ |
|||
var myPermission2 = PermissionDefinitionManager.Get("MyPermission2"); |
|||
|
|||
(await PermissionStateManager.IsEnabledAsync(myPermission2)).ShouldBeFalse(); |
|||
|
|||
using (CurrentPrincipalAccessor.Change(new Claim(AbpClaimTypes.Role, "admin"))) |
|||
{ |
|||
(await PermissionStateManager.IsEnabledAsync(myPermission2)).ShouldBeTrue(); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,17 @@ |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Volo.Abp.Authorization.Permissions; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Security.Claims; |
|||
|
|||
namespace Volo.Abp.Authorization |
|||
{ |
|||
public class TestGlobalRequireRolePermissionStateProvider : IPermissionStateProvider, ITransientDependency |
|||
{ |
|||
public Task<bool> IsEnabledAsync(PermissionStateContext context) |
|||
{ |
|||
var currentPrincipalAccessor = context.ServiceProvider.GetRequiredService<ICurrentPrincipalAccessor>(); |
|||
return Task.FromResult(currentPrincipalAccessor.Principal != null && currentPrincipalAccessor.Principal.IsInRole("admin")); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,17 @@ |
|||
using System.Security.Principal; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Volo.Abp.Authorization.Permissions; |
|||
using Volo.Abp.Security.Claims; |
|||
|
|||
namespace Volo.Abp.Authorization |
|||
{ |
|||
public class TestRequireEditionPermissionStateProvider : IPermissionStateProvider |
|||
{ |
|||
public Task<bool> IsEnabledAsync(PermissionStateContext context) |
|||
{ |
|||
var currentPrincipalAccessor = context.ServiceProvider.GetRequiredService<ICurrentPrincipalAccessor>(); |
|||
return Task.FromResult(currentPrincipalAccessor.Principal?.FindEditionId() != null); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,25 @@ |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Volo.Abp.Authorization.Permissions; |
|||
using Volo.Abp.Security.Claims; |
|||
|
|||
namespace Volo.Abp.PermissionManagement |
|||
{ |
|||
public class TestRequireRolePermissionStateProvider : IPermissionStateProvider |
|||
{ |
|||
private readonly List<string> _allowRoles = new List<string>(); |
|||
|
|||
public TestRequireRolePermissionStateProvider(params string[] roles) |
|||
{ |
|||
_allowRoles.AddRange(roles); |
|||
} |
|||
|
|||
public Task<bool> IsEnabledAsync(PermissionStateContext context) |
|||
{ |
|||
var currentPrincipalAccessor = context.ServiceProvider.GetRequiredService<ICurrentPrincipalAccessor>(); |
|||
return Task.FromResult(currentPrincipalAccessor.Principal != null && _allowRoles.Any(role => currentPrincipalAccessor.Principal.IsInRole(role))); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue