JwtHandler.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using Furion;
  2. using Furion.Authorization;
  3. using Furion.DataEncryption;
  4. using gpt_api.Entity.System;
  5. using gpt_api.Respository;
  6. using Microsoft.AspNetCore.Authorization;
  7. using Microsoft.AspNetCore.Http;
  8. using System.Security.Claims;
  9. using System.Threading.Tasks;
  10. namespace gpt_api.Web.Core;
  11. public class JwtHandler : AppAuthorizeHandler
  12. {
  13. /// <summary>
  14. /// 重写 Handler 添加自动刷新收取逻辑
  15. /// </summary>
  16. /// <param name="context"></param>
  17. /// <returns></returns>
  18. public override async Task HandleAsync(AuthorizationHandlerContext context)
  19. {
  20. // 自动刷新 token
  21. if (JWTEncryption.AutoRefreshToken(context, context.GetCurrentHttpContext()))
  22. {
  23. await AuthorizeHandleAsync(context);
  24. }
  25. else context.Fail();// 授权失败
  26. }
  27. /// <summary>
  28. /// 验证管道,也就是验证核心代码
  29. /// </summary>
  30. /// <param name="context"></param>
  31. /// <param name="httpContext"></param>
  32. /// <returns></returns>
  33. public override async Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
  34. {
  35. // 这里写您的授权判断逻辑,授权通过返回 true,否则返回 false
  36. return await CheckAuthorzie(httpContext);
  37. }
  38. /// <summary>
  39. /// 检查权限
  40. /// </summary>
  41. /// <param name="httpContext"></param>
  42. /// <returns></returns>
  43. private static async Task<bool> CheckAuthorzie(DefaultHttpContext httpContext)
  44. {
  45. // 获取权限特性
  46. var securityDefineAttribute = httpContext.GetMetadata<SecurityDefineAttribute>();
  47. if (securityDefineAttribute == null)//是否包含鉴权attribute
  48. {
  49. return true;
  50. }
  51. else
  52. {
  53. var path = httpContext.Request.Path.ToString();
  54. var userId = int.Parse(App.User?.FindFirstValue("UserId"));
  55. var _sysUserRoleRepository = App.GetService<IRepository<SysUserRoleEntity>>();
  56. var _sysRoleSecurityRepository = App.GetService<IRepository<SysRoleSecurityEntity>>();
  57. // 解析服务
  58. var roleIds = await _sysUserRoleRepository.GetFieldDistinctListAsync(o => o.UserId == userId, o => o.RoleId);
  59. var securityList = await _sysRoleSecurityRepository.GetFieldDistinctListAsync(o => roleIds.Contains(o.RoleId), o => o.Security);
  60. return securityList.Contains(path);
  61. }
  62. }
  63. }