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
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; |
|
} |
|
} |
|
} |