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