JwtHandler.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using Admin.NET.Core;
  2. using Admin.NET.Core.Service;
  3. using Furion;
  4. using Furion.Authorization;
  5. using Furion.DataEncryption;
  6. using Microsoft.AspNetCore.Authorization;
  7. using Microsoft.AspNetCore.Http;
  8. using System.Threading.Tasks;
  9. namespace Admin.NET.Web.Core
  10. {
  11. public class JwtHandler : AppAuthorizeHandler
  12. {
  13. /// <summary>
  14. /// 自动刷新Token
  15. /// </summary>
  16. /// <param name="context"></param>
  17. /// <returns></returns>
  18. public override async Task HandleAsync(AuthorizationHandlerContext context)
  19. {
  20. if (JWTEncryption.AutoRefreshToken(context, context.GetCurrentHttpContext(),
  21. App.GetOptions<JWTSettingsOptions>().ExpiredTime,
  22. App.GetOptions<RefreshTokenOptions>().ExpiredTime))
  23. {
  24. await AuthorizeHandleAsync(context);
  25. }
  26. else
  27. {
  28. context.Fail(); // 授权失败
  29. DefaultHttpContext currentHttpContext = context.GetCurrentHttpContext();
  30. if (currentHttpContext == null)
  31. return;
  32. currentHttpContext.SignoutToSwagger();
  33. }
  34. }
  35. public override async Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
  36. {
  37. // 已自动验证 Jwt Token 有效性
  38. return await CheckAuthorzieAsync(httpContext);
  39. }
  40. /// <summary>
  41. /// 权限校验核心逻辑
  42. /// </summary>
  43. /// <param name="httpContext"></param>
  44. /// <returns></returns>
  45. private static async Task<bool> CheckAuthorzieAsync(DefaultHttpContext httpContext)
  46. {
  47. // 排除超管
  48. if (App.User.FindFirst(ClaimConst.AccountType)?.Value == ((int)AccountTypeEnum.SuperAdmin).ToString())
  49. return true;
  50. // 路由/按钮名称
  51. var routeName = httpContext.Request.Path.Value[1..].Replace("/", ":");
  52. // 获取用户拥有按钮权限集合
  53. var ownBtnPermList = await App.GetService<SysMenuService>().GetOwnBtnPermList();
  54. // 获取系统所有按钮权限集合
  55. var allBtnPermList = await App.GetService<SysMenuService>().GetAllBtnPermList();
  56. // 已拥有该按钮权限或者所有按钮集合里面不存在
  57. var exist1 = ownBtnPermList.Exists(u => routeName.Contains(u, System.StringComparison.CurrentCultureIgnoreCase));
  58. var exist2 = allBtnPermList.TrueForAll(u => !routeName.Contains(u, System.StringComparison.CurrentCultureIgnoreCase));
  59. return exist1 || exist2;
  60. }
  61. }
  62. }