hello-shop/src/HelloShop.ServiceDefaults/Extensions/PermissionExtensions.cs
2024-04-25 22:59:28 +08:00

83 lines
3.0 KiB
C#

using HelloShop.ServiceDefaults.Authorization;
using HelloShop.ServiceDefaults.Permissions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;
namespace HelloShop.ServiceDefaults.Extensions;
public static class PermissionExtensions
{
public static IServiceCollection AddPermissionDefinitions(this IServiceCollection services, Assembly? assembly = null)
{
assembly ??= Assembly.GetCallingAssembly();
var permissionDefinitionProviders = assembly.ExportedTypes.Where(t => t.IsAssignableTo(typeof(IPermissionDefinitionProvider)));
permissionDefinitionProviders.ToList().ForEach(t => services.AddTransient(typeof(IPermissionDefinitionProvider), t));
services.AddTransient<IPermissionDefinitionManager, PermissionDefinitionManager>();
return services;
}
public static IEndpointRouteBuilder MapPermissionDefinitions(this IEndpointRouteBuilder endpoints, params string[] tags)
{
var routeGroup = endpoints.MapGroup(string.Empty);
routeGroup.MapGet("PermissionDefinitions", async (IPermissionDefinitionManager permissionDefinitionManager) =>
{
List<PermissionGroupDefinitionResponse> result = [];
var permissionGroups = await permissionDefinitionManager.GetGroupsAsync();
foreach (var permissionGroup in permissionGroups)
{
PermissionGroupDefinitionResponse permissionGroupDefinition = new()
{
GroupName = permissionGroup.Name,
DisplayName = permissionGroup.DisplayName,
Permissions = []
};
foreach (PermissionDefinition? permission in permissionGroup.GetPermissionsWithChildren())
{
PermissionDefinitionResponse permissionDefinition = new()
{
Name = permission.Name,
DisplayName = permission.DisplayName,
ParentName = permission.Parent?.Name
};
permissionGroupDefinition.Permissions.Add(permissionDefinition);
}
result.Add(permissionGroupDefinition);
}
return result;
}).WithTags(tags);
return routeGroup;
}
public static IServiceCollection AddRemotePermissionChecker(this IServiceCollection services)
{
services.AddTransient<IPermissionChecker, RemotePermissionChecker>();
return services;
}
public static IServiceCollection AddCustomAuthorization(this IServiceCollection services)
{
services.AddSingleton<IAuthorizationPolicyProvider, CustomAuthorizationPolicyProvider>();
services.AddTransient<IAuthorizationHandler, PermissionRequirementHandler>();
return services;
}
}