reduce code repeat, introduce MustSatisfyRequirementAuthorizationHandler

This commit is contained in:
Shannon
2020-11-26 17:25:43 +11:00
parent 75e6eb0bd9
commit aeab78f6a1
12 changed files with 127 additions and 170 deletions

View File

@@ -15,7 +15,7 @@ namespace Umbraco.Web.BackOffice.Authorization
/// <summary>
/// Used to authorize if the user has the correct permission access to the content for the content id specified in a query string
/// </summary>
public class ContentPermissionsQueryStringHandler : AuthorizationHandler<ContentPermissionsQueryStringRequirement>
public class ContentPermissionsQueryStringHandler : MustSatisfyRequirementAuthorizationHandler<ContentPermissionsQueryStringRequirement>
{
private readonly IBackOfficeSecurityAccessor _backofficeSecurityAccessor;
private readonly IHttpContextAccessor _httpContextAccessor;
@@ -34,7 +34,7 @@ namespace Umbraco.Web.BackOffice.Authorization
_contentPermissions = contentPermissions;
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ContentPermissionsQueryStringRequirement requirement)
protected override Task<bool> IsAuthorized(AuthorizationHandlerContext context, ContentPermissionsQueryStringRequirement requirement)
{
int nodeId;
if (requirement.NodeId.HasValue == false)
@@ -42,8 +42,7 @@ namespace Umbraco.Web.BackOffice.Authorization
if (!_httpContextAccessor.HttpContext.Request.Query.TryGetValue(requirement.QueryStringName, out var routeVal))
{
// must succeed this requirement since we cannot process it
context.Succeed(requirement);
return Task.CompletedTask;
return Task.FromResult(true);
}
else
{
@@ -72,29 +71,21 @@ namespace Umbraco.Web.BackOffice.Authorization
}
var permissionResult = _contentPermissions.CheckPermissions(nodeId,
_backofficeSecurityAccessor.BackOfficeSecurity.CurrentUser,
_backofficeSecurityAccessor.BackOfficeSecurity.CurrentUser,
out IContent contentItem,
new[] { requirement.PermissionToCheck });
switch (permissionResult)
{
case ContentPermissions.ContentAccess.Denied:
context.Fail();
break;
case ContentPermissions.ContentAccess.NotFound:
default:
context.Succeed(requirement);
break;
}
if (contentItem != null)
{
//store the content item in request cache so it can be resolved in the controller without re-looking it up
_httpContextAccessor.HttpContext.Items[typeof(IContent).ToString()] = contentItem;
}
return Task.CompletedTask;
return permissionResult switch
{
ContentPermissions.ContentAccess.Denied => Task.FromResult(false),
_ => Task.FromResult(true),
};
}
}
}