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
3 years ago
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|