mirror of https://github.com/abpframework/abp.git
2 changed files with 36 additions and 30 deletions
@ -1,53 +1,49 @@ |
|||||
using System; |
using System; |
||||
|
using System.Collections.Generic; |
||||
using System.Threading.Tasks; |
using System.Threading.Tasks; |
||||
using Hangfire.Dashboard; |
using Hangfire.Dashboard; |
||||
|
using Microsoft.AspNetCore.Authorization; |
||||
using Microsoft.Extensions.DependencyInjection; |
using Microsoft.Extensions.DependencyInjection; |
||||
using Volo.Abp.Authorization.Permissions; |
using Volo.Abp.Authorization; |
||||
using Volo.Abp.Users; |
using Volo.Abp.MultiTenancy; |
||||
|
|
||||
namespace Volo.Abp.Hangfire; |
namespace Volo.Abp.Hangfire; |
||||
|
|
||||
public class AbpHangfireAuthorizationFilter : IDashboardAsyncAuthorizationFilter |
public class AbpHangfireAuthorizationFilter : IDashboardAsyncAuthorizationFilter |
||||
{ |
{ |
||||
private readonly bool _enableTenant; |
private readonly bool _enableTenant; |
||||
private readonly string? _requiredPermissionName; |
private readonly AuthorizationPolicyBuilder _policyBuilder; |
||||
|
|
||||
public AbpHangfireAuthorizationFilter(bool enableTenant = false, string? requiredPermissionName = null) |
public virtual AuthorizationPolicyBuilder PolicyBuilder => _policyBuilder; |
||||
{ |
|
||||
_enableTenant = requiredPermissionName.IsNullOrWhiteSpace() ? enableTenant : true; |
|
||||
_requiredPermissionName = requiredPermissionName; |
|
||||
} |
|
||||
|
|
||||
public async Task<bool> AuthorizeAsync(DashboardContext context) |
public AbpHangfireAuthorizationFilter(bool enableTenant = false, string? requiredPermissionName = null, params string[]? requiredRoleNames) |
||||
{ |
{ |
||||
if (!IsLoggedIn(context, _enableTenant)) |
_enableTenant = enableTenant; |
||||
|
_policyBuilder = new AuthorizationPolicyBuilder().RequireAuthenticatedUser(); |
||||
|
if (!requiredPermissionName.IsNullOrWhiteSpace()) |
||||
{ |
{ |
||||
return false; |
_policyBuilder.Requirements.Add(new PermissionRequirement(requiredPermissionName)); |
||||
} |
} |
||||
|
|
||||
if (_requiredPermissionName.IsNullOrEmpty()) |
if (!requiredRoleNames.IsNullOrEmpty()) |
||||
{ |
{ |
||||
return true; |
foreach (var roleName in requiredRoleNames!) |
||||
|
{ |
||||
|
_policyBuilder.RequireRole(roleName); |
||||
|
} |
||||
} |
} |
||||
|
|
||||
return await IsPermissionGrantedAsync(context, _requiredPermissionName!); |
|
||||
} |
} |
||||
|
|
||||
private static bool IsLoggedIn(DashboardContext context, bool enableTenant) |
public virtual async Task<bool> AuthorizeAsync(DashboardContext context) |
||||
{ |
{ |
||||
var currentUser = context.GetHttpContext().RequestServices.GetRequiredService<ICurrentUser>(); |
var currentTenant = context.GetHttpContext().RequestServices.GetRequiredService<ICurrentTenant>(); |
||||
|
if (currentTenant.IsAvailable && !_enableTenant) |
||||
if (!enableTenant) |
|
||||
{ |
{ |
||||
return currentUser.IsAuthenticated && !currentUser.TenantId.HasValue; |
return false; |
||||
} |
} |
||||
|
|
||||
return currentUser.IsAuthenticated; |
var authorizationService = context.GetHttpContext().RequestServices.GetRequiredService<IAuthorizationService>(); |
||||
} |
var authorizationPolicy = _policyBuilder.Build(); |
||||
|
return (await authorizationService.AuthorizeAsync(context.GetHttpContext().User, authorizationPolicy)).Succeeded; |
||||
private static async Task<bool> IsPermissionGrantedAsync(DashboardContext context, string requiredPermissionName) |
|
||||
{ |
|
||||
var permissionChecker = context.GetHttpContext().RequestServices.GetRequiredService<IPermissionChecker>(); |
|
||||
return await permissionChecker.IsGrantedAsync(requiredPermissionName); |
|
||||
} |
} |
||||
} |
} |
||||
|
|||||
Loading…
Reference in new issue