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.
61 lines
2.1 KiB
61 lines
2.1 KiB
3 years ago
|
using System.Linq;
|
||
|
using System.Threading.Tasks;
|
||
|
using Volo.Abp.DependencyInjection;
|
||
|
using Volo.Abp.Security.Claims;
|
||
|
|
||
|
namespace Sanhe.Abp.MenuManagement
|
||
|
{
|
||
|
public abstract class MenuGrantRuntimeCheckerProvider : IMenuGrantRuntimeCheckerProvider
|
||
|
{
|
||
|
protected IMenuGrantChecker MenuGrantChecker { get; }
|
||
|
|
||
|
protected MenuGrantRuntimeCheckerProvider(IMenuGrantChecker menuGrantChecker)
|
||
|
{
|
||
|
MenuGrantChecker = menuGrantChecker;
|
||
|
}
|
||
|
|
||
|
public abstract Task<MenuGrantResultEnum> CheckAsync(MenuGrantRuntimeCheckerContent context);
|
||
|
}
|
||
|
|
||
|
public class RoleMenuGrantRuntimeCheckerProvider : MenuGrantRuntimeCheckerProvider, ITransientDependency
|
||
|
{
|
||
|
public RoleMenuGrantRuntimeCheckerProvider(IMenuGrantChecker menuGrantChecker) : base(menuGrantChecker)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
public override async Task<MenuGrantResultEnum> CheckAsync(MenuGrantRuntimeCheckerContent context)
|
||
|
{
|
||
|
var roles = context.Principal?.FindAll(AbpClaimTypes.Role).Select(c => c.Value).ToArray();
|
||
|
|
||
|
if (roles == null || !roles.Any())
|
||
|
{
|
||
|
return MenuGrantResultEnum.Undefined;
|
||
|
}
|
||
|
|
||
|
foreach (var role in roles)
|
||
|
{
|
||
|
var result = await MenuGrantChecker.CheckAsync(context.Menu.Id, "R", role);
|
||
|
if (result.IsGranted)
|
||
|
{
|
||
|
return MenuGrantResultEnum.Granted;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return MenuGrantResultEnum.Undefined;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public class UserMenuGrantRuntimeCheckerProvider : MenuGrantRuntimeCheckerProvider, ITransientDependency
|
||
|
{
|
||
|
public UserMenuGrantRuntimeCheckerProvider(IMenuGrantChecker menuGrantChecker) : base(menuGrantChecker)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
public override async Task<MenuGrantResultEnum> CheckAsync(MenuGrantRuntimeCheckerContent context)
|
||
|
{
|
||
|
var userId = context.Principal?.FindFirst(AbpClaimTypes.UserId)?.Value;
|
||
|
var result = await MenuGrantChecker.CheckAsync(context.Menu.Id, "U", userId);
|
||
|
return result.IsGranted ? MenuGrantResultEnum.Granted : MenuGrantResultEnum.Undefined;
|
||
|
}
|
||
|
}
|
||
|
}
|