|  |  |  | @ -1,10 +1,13 @@ | 
			
		
	
		
			
				
					|  |  |  |  | using System; | 
			
		
	
		
			
				
					|  |  |  |  | using System.Collections.Generic; | 
			
		
	
		
			
				
					|  |  |  |  | using System.Linq; | 
			
		
	
		
			
				
					|  |  |  |  | using System.Security.Claims; | 
			
		
	
		
			
				
					|  |  |  |  | using System.Threading.Tasks; | 
			
		
	
		
			
				
					|  |  |  |  | using JetBrains.Annotations; | 
			
		
	
		
			
				
					|  |  |  |  | using Microsoft.Extensions.DependencyInjection; | 
			
		
	
		
			
				
					|  |  |  |  | using Microsoft.Extensions.Options; | 
			
		
	
		
			
				
					|  |  |  |  | using Volo.Abp.DependencyInjection; | 
			
		
	
		
			
				
					|  |  |  |  | using Volo.Abp.Security.Claims; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | namespace Volo.Abp.Authorization.Permissions | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
	
		
			
				
					|  |  |  | @ -14,6 +17,8 @@ namespace Volo.Abp.Authorization.Permissions | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         protected IReadOnlyList<IPermissionValueProvider> ValueProviders => _lazyProviders.Value; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         protected ICurrentPrincipalAccessor PrincipalAccessor { get; } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         protected PermissionOptions Options { get; } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         private readonly Lazy<List<IPermissionValueProvider>> _lazyProviders; | 
			
		
	
	
		
			
				
					|  |  |  | @ -21,8 +26,10 @@ namespace Volo.Abp.Authorization.Permissions | 
			
		
	
		
			
				
					|  |  |  |  |         public PermissionChecker( | 
			
		
	
		
			
				
					|  |  |  |  |             IOptions<PermissionOptions> options, | 
			
		
	
		
			
				
					|  |  |  |  |             IServiceProvider serviceProvider, | 
			
		
	
		
			
				
					|  |  |  |  |             ICurrentPrincipalAccessor principalAccessor, | 
			
		
	
		
			
				
					|  |  |  |  |             IPermissionDefinitionManager permissionDefinitionManager) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             PrincipalAccessor = principalAccessor; | 
			
		
	
		
			
				
					|  |  |  |  |             PermissionDefinitionManager = permissionDefinitionManager; | 
			
		
	
		
			
				
					|  |  |  |  |             Options = options.Value; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -35,25 +42,30 @@ namespace Volo.Abp.Authorization.Permissions | 
			
		
	
		
			
				
					|  |  |  |  |             ); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |          | 
			
		
	
		
			
				
					|  |  |  |  |         public Task<PermissionGrantInfo> CheckAsync(string name) | 
			
		
	
		
			
				
					|  |  |  |  |         public virtual Task<PermissionGrantInfo> CheckAsync(string name) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             var permission = PermissionDefinitionManager.Get(name); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             return GetPermissionGrantInfo(permission); | 
			
		
	
		
			
				
					|  |  |  |  |             return CheckAsync(PrincipalAccessor.Principal, name); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         protected virtual async Task<PermissionGrantInfo> GetPermissionGrantInfo(PermissionDefinition permission) | 
			
		
	
		
			
				
					|  |  |  |  |         public virtual async Task<PermissionGrantInfo> CheckAsync(ClaimsPrincipal claimsPrincipal, string name) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             Check.NotNull(name, nameof(name)); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             var context = new PermissionValueCheckContext( | 
			
		
	
		
			
				
					|  |  |  |  |                 PermissionDefinitionManager.Get(name), | 
			
		
	
		
			
				
					|  |  |  |  |                 claimsPrincipal | 
			
		
	
		
			
				
					|  |  |  |  |             ); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             foreach (var provider in ValueProviders) | 
			
		
	
		
			
				
					|  |  |  |  |             { | 
			
		
	
		
			
				
					|  |  |  |  |                 var result = await provider.CheckAsync(permission); | 
			
		
	
		
			
				
					|  |  |  |  |                 var result = await provider.CheckAsync(context); | 
			
		
	
		
			
				
					|  |  |  |  |                 if (result.IsGranted) | 
			
		
	
		
			
				
					|  |  |  |  |                 { | 
			
		
	
		
			
				
					|  |  |  |  |                     return new PermissionGrantInfo(permission.Name, true, provider.Name, result.ProviderKey); | 
			
		
	
		
			
				
					|  |  |  |  |                     return new PermissionGrantInfo(context.Permission.Name, true, provider.Name, result.ProviderKey); | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             return new PermissionGrantInfo(permission.Name, false); | 
			
		
	
		
			
				
					|  |  |  |  |             return new PermissionGrantInfo(context.Permission.Name, false); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | } |