using Microsoft.AspNetCore.Authorization;
using DomainObjects.Documents;
using Core.Enumerations;
using DataProviders.Collections;
using WeatherForecast.Policies.Abstractions;
using Microsoft.Extensions.Options;
using DomainObjects.Documents.Users;
namespace WeatherForecast.Policies;
///
///
///
public class BlogAuthorizationHandler : AuthorizationHandlerBase> {
///
///
///
///
///
///
///
public BlogAuthorizationHandler(
IOptions configuration,
IHttpContextAccessor contextAccessor,
ISiteDataProvider siteDataProvider,
IUserDataProvider userDataProvider
) : base(configuration, contextAccessor, siteDataProvider, userDataProvider) { }
///
///
///
///
///
///
///
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, BlogAuthorizationRequirement requirement, List resource) {
var (site, user) = GetUser(context);
if (site == null || user == null)
return Task.CompletedTask;
var userRole = GetRole(site, user);
// Can only Admin, Editor, Author, Contributor (cannot set publish date)
if (requirement.Action == CrudActions.Create
&& (userRole != Roles.Admin
&& userRole != Roles.Editor
&& userRole != Roles.Author
&& userRole != Roles.Contributor
&& (userRole == Roles.Contributor && resource.Any(x => x.Published != null))))
return Task.CompletedTask;
// Can only Admin, Editor, Author, Contributor
if (requirement.Action == CrudActions.Read
&& (userRole != Roles.Admin
&& userRole != Roles.Editor
&& userRole != Roles.Author
&& userRole != Roles.Contributor))
return Task.CompletedTask;
// Can only Admin, Editor, Author (own), Contributor (own, not yet pubblished)
if ((requirement.Action == CrudActions.Update || requirement.Action == CrudActions.Delete)
&& (userRole != Roles.Admin
&& userRole != Roles.Editor
&& userRole != Roles.Author
&& userRole != Roles.Contributor
&& ((userRole == Roles.Author || userRole == Roles.Contributor) && resource.Any(x => x.Author != user.Id))
&& (userRole == Roles.Contributor && resource.Any(x => x.Published != null))))
return Task.CompletedTask;
context.Succeed(requirement);
return Task.CompletedTask;
}
}
///
///
///
public class BlogAuthorizationRequirement : AuthorizationRequirementBase { }