You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LuPermissionMiddleware.cs 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using System;
  2. using System.Reflection;
  3. using Luticate2.Auth.Attributes;
  4. using Luticate2.Auth.Interfaces.Permissions;
  5. using Luticate2.Auth.Interfaces.Users;
  6. using Luticate2.Utils.Controllers;
  7. using Luticate2.Utils.Dbo.Result;
  8. using Microsoft.AspNetCore.Authorization.Infrastructure;
  9. using Microsoft.AspNetCore.Mvc.Controllers;
  10. using Microsoft.AspNetCore.Mvc.Filters;
  11. using Microsoft.Extensions.DependencyInjection;
  12. namespace Luticate2.Auth.Middlewares
  13. {
  14. public class LuPermissionMiddleware : IActionFilter
  15. {
  16. private readonly IServiceProvider _serviceProvider;
  17. private readonly ILuPermissionsBusiness _luPermissionsBusiness;
  18. public LuPermissionMiddleware(IServiceProvider serviceProvider, ILuPermissionsBusiness luPermissionsBusiness)
  19. {
  20. _serviceProvider = serviceProvider;
  21. _luPermissionsBusiness = luPermissionsBusiness;
  22. }
  23. public void OnActionExecuting(ActionExecutingContext context)
  24. {
  25. var actionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;
  26. if (actionDescriptor == null)
  27. {
  28. LuResult<bool>.Error(LuStatus.InternalError,
  29. $"{nameof(LuPermissionMiddleware)}: actionDescriptor == null").Throw();
  30. return;
  31. }
  32. var attributes = actionDescriptor.MethodInfo.GetCustomAttributes<LuPermissionAttribute>();
  33. foreach (var attribute in attributes)
  34. {
  35. var srcAccessor = _serviceProvider.GetService(attribute.SrcEntityAccessor) as ILuAttrEntityAccessor;
  36. var dstAccessor = _serviceProvider.GetService(attribute.DstEntityAccessor) as ILuAttrEntityAccessor;
  37. var srcEntity = srcAccessor?.GetEntity(context, attribute.Id);
  38. var dstEntity = dstAccessor?.GetEntity(context, attribute.Id);
  39. var permissionValue = _luPermissionsBusiness.GetPermissionEffectiveValue(attribute.PermissionName,
  40. attribute.SrcEntityType, srcEntity, attribute.DstEntityType, dstEntity).ThrowIfNotSuccess();
  41. if (!permissionValue.Data)
  42. {
  43. var user = _serviceProvider.GetService<ILuLoggedUserAccessor>().GetLoggedUser();
  44. LuResult<object>.Error(LuStatus.PermissionError,$"user: {user?.Id} {user?.Username}",
  45. "Permission denied").Throw();
  46. }
  47. }
  48. }
  49. public void OnActionExecuted(ActionExecutedContext context)
  50. {
  51. }
  52. }
  53. }