Adding
This commit is contained in:
+44
@@ -0,0 +1,44 @@
|
||||
using LCU.API.Internal.Operations.IncentiveApiLib.Persistence;
|
||||
using LCU.API.Internal.Operations.IncentiveApiLib.Services;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
|
||||
namespace LCU.API.Internal.Operations.IncentiveApi.Authorization;
|
||||
|
||||
public class PermissionAuthorizationHandler : AuthorizationHandler<PermissionRequirement>
|
||||
{
|
||||
private readonly ICurrentUserService _currentUserService;
|
||||
private readonly IUserService _userService;
|
||||
|
||||
public PermissionAuthorizationHandler(ICurrentUserService currentUserService, IUserService userService)
|
||||
{
|
||||
_currentUserService = currentUserService;
|
||||
_userService = userService;
|
||||
}
|
||||
|
||||
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context,
|
||||
PermissionRequirement requirement)
|
||||
{
|
||||
try
|
||||
{
|
||||
var allowedPermissions = requirement.Permissions.Split(',').ToList();
|
||||
var appUser = _currentUserService.GetCurrentUser();
|
||||
if (appUser.Email == null)
|
||||
{
|
||||
context.Fail();
|
||||
return;
|
||||
}
|
||||
|
||||
if (await _userService.UserHasAnyRequiredPermission(appUser.Email, allowedPermissions))
|
||||
{
|
||||
context.Succeed(requirement);
|
||||
return;
|
||||
}
|
||||
context.Fail();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error(ex, $"Failure in {GetType().Name}");
|
||||
context.Fail();
|
||||
}
|
||||
}
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
namespace LCU.API.Internal.Operations.IncentiveApi.Authorization;
|
||||
|
||||
public class PermissionPolicyProvider : IAuthorizationPolicyProvider
|
||||
{
|
||||
const string POLICY_PREFIX = "Permission";
|
||||
public DefaultAuthorizationPolicyProvider FallbackPolicyProvider { get; }
|
||||
|
||||
public PermissionPolicyProvider(IOptions<AuthorizationOptions> options)
|
||||
{
|
||||
FallbackPolicyProvider = new DefaultAuthorizationPolicyProvider(options);
|
||||
}
|
||||
|
||||
public Task<AuthorizationPolicy> GetDefaultPolicyAsync() => FallbackPolicyProvider.GetDefaultPolicyAsync();
|
||||
|
||||
public Task<AuthorizationPolicy> GetFallbackPolicyAsync() => FallbackPolicyProvider.GetFallbackPolicyAsync();
|
||||
|
||||
public Task<AuthorizationPolicy> GetPolicyAsync(string policyName)
|
||||
{
|
||||
if (policyName.StartsWith(POLICY_PREFIX, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
var allowedPermissions = policyName.Substring(POLICY_PREFIX.Length);
|
||||
var policy = new AuthorizationPolicyBuilder();
|
||||
policy.AddRequirements(new PermissionRequirement(allowedPermissions));
|
||||
return Task.FromResult(policy.Build());
|
||||
}
|
||||
|
||||
return FallbackPolicyProvider.GetPolicyAsync(policyName);
|
||||
}
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
|
||||
namespace LCU.API.Internal.Operations.IncentiveApi.Authorization;
|
||||
|
||||
public class PermissionRequirement : IAuthorizationRequirement
|
||||
{
|
||||
public string Permissions { get; private set; }
|
||||
public PermissionRequirement(string permissions)
|
||||
{
|
||||
Permissions = permissions;
|
||||
}
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
|
||||
namespace LCU.API.Internal.Operations.IncentiveApi.Authorization;
|
||||
|
||||
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
|
||||
public class RequirePermissionAttribute : AuthorizeAttribute
|
||||
{
|
||||
const string POLICY_PREFIX = "Permission";
|
||||
|
||||
public RequirePermissionAttribute(string permissions) => Permissions = permissions;
|
||||
|
||||
public string Permissions
|
||||
{
|
||||
get => Policy.Substring(POLICY_PREFIX.Length);
|
||||
set => Policy = $"{POLICY_PREFIX}{value}";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user