JwtHandler.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. // 登录模式判断PC、APP
  48. if (App.User.FindFirst(ClaimConst.LoginMode)?.Value == ((int)LoginModeEnum.APP).ToString())
  49. return true;
  50. // 排除超管
  51. if (App.User.FindFirst(ClaimConst.AccountType)?.Value == ((int)AccountTypeEnum.SuperAdmin).ToString())
  52. return true;
  53. // 路由/按钮名称
  54. var routeName = httpContext.Request.Path.Value[1..].Replace("/", ":");
  55. // 获取用户拥有按钮权限集合
  56. var ownBtnPermList = await App.GetService<SysMenuService>().GetOwnBtnPermList();
  57. // 获取系统所有按钮权限集合
  58. var allBtnPermList = await App.GetService<SysMenuService>().GetAllBtnPermList();
  59. // 已拥有该按钮权限或者所有按钮集合里面不存在
  60. var exist1 = ownBtnPermList.Exists(u => routeName.Contains(u, System.StringComparison.CurrentCultureIgnoreCase));
  61. var exist2 = allBtnPermList.TrueForAll(u => !routeName.Contains(u, System.StringComparison.CurrentCultureIgnoreCase));
  62. return exist1 || exist2;
  63. }
  64. }
  65. }