You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.9 KiB
65 lines
1.9 KiB
using System; |
|
using System.Collections.Generic; |
|
using System.Security.Claims; |
|
using System.Security.Principal; |
|
using System.Threading.Tasks; |
|
using Volo.Abp.DependencyInjection; |
|
using Volo.Abp.MultiTenancy; |
|
|
|
namespace Sanhe.Abp.MenuManagement |
|
{ |
|
public interface IUserMenuGrantChecker |
|
{ |
|
Task<bool> CheckAsync(ClaimsPrincipal claimsPrincipal, Menu menu); |
|
} |
|
|
|
public class UserMenuGrantChecker : IUserMenuGrantChecker, ITransientDependency |
|
{ |
|
private readonly ICurrentTenant _currentTenant; |
|
private readonly IEnumerable<IMenuGrantRuntimeCheckerProvider> _checkerProviders; |
|
|
|
public UserMenuGrantChecker( |
|
ICurrentTenant currentTenant, |
|
IEnumerable<IMenuGrantRuntimeCheckerProvider> checkerProviders |
|
) |
|
{ |
|
_currentTenant = currentTenant; |
|
_checkerProviders = checkerProviders; |
|
} |
|
|
|
public async Task<bool> CheckAsync(ClaimsPrincipal claimsPrincipal, Menu menu) |
|
{ |
|
var multiTenancySide = claimsPrincipal?.GetMultiTenancySide() |
|
?? _currentTenant.GetMultiTenancySide(); |
|
|
|
if (!menu.MultiTenancySide.HasFlag(multiTenancySide)) |
|
{ |
|
return false; |
|
} |
|
|
|
if (menu.PermissionKey.IsNullOrWhiteSpace()) |
|
{ |
|
return true; |
|
} |
|
|
|
var isGranted = false; |
|
var content = new MenuGrantRuntimeCheckerContent |
|
{ |
|
Menu = menu, |
|
Principal = claimsPrincipal |
|
}; |
|
|
|
foreach (var provider in _checkerProviders) |
|
{ |
|
var result = await provider.CheckAsync(content); |
|
if (result == MenuGrantResultEnum.Granted) |
|
{ |
|
isGranted = true; |
|
break; |
|
} |
|
} |
|
|
|
return isGranted; |
|
} |
|
} |
|
} |