jwt.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package middleware
  2. import (
  3. "go-nc/configs/global"
  4. routes "go-nc/internal/router"
  5. "go-nc/internal/utils"
  6. "go-nc/model"
  7. "github.com/gin-gonic/gin"
  8. )
  9. var TokenExpired = 886
  10. // JwtAuth 中间件
  11. func JwtAuth() gin.HandlerFunc {
  12. return func(c *gin.Context) {
  13. // 白名单
  14. if utils.Contains(routes.NoAuthApi, c.Request.URL.Path) {
  15. c.Next()
  16. return
  17. }
  18. // 获取token
  19. auth := c.Request.Header.Get("Authorization")
  20. if len(auth) == 0 {
  21. // 无token直接拒绝
  22. c.Abort()
  23. ErrorResponse(c, TokenExpired, "token无效")
  24. return
  25. }
  26. // 校验token
  27. claims, err := utils.ParseToken(auth)
  28. if err != nil {
  29. // if strings.Contains(err.Error(), "expired") {
  30. // // 若过期,调用续签函数
  31. // newToken, _ := utils.RenewToken(claims)
  32. // if newToken != "" {
  33. // // 续签成功給返回头设置一个newtoken字段
  34. // c.Header("newtoken", newToken)
  35. // c.Request.Header.Set("Authorization", newToken)
  36. // c.Next()
  37. // return
  38. // }
  39. // }
  40. // Token验证失败或续签失败直接拒绝请求
  41. c.Abort()
  42. ErrorResponse(c, TokenExpired, "token无效!")
  43. return
  44. }
  45. // 查询数据库,验证用户信息
  46. var userInfo model.Sys_user
  47. global.App.DB.Where("id= ? AND username = ?", claims.User.Id, claims.User.UserName).First(&userInfo)
  48. userInfo.Password = ""
  49. // 用户不存在
  50. if userInfo.Id == 0 {
  51. // 用户不存在直接拒绝
  52. c.Abort() // 终止请求
  53. ErrorResponse(c, TokenExpired, "token无效!")
  54. return
  55. }
  56. // 状态不正常直接拒绝
  57. if userInfo.State != "1" {
  58. c.Abort() // 终止请求
  59. ErrorResponse(c, TokenExpired, "账号已被锁定,请联系管理员!")
  60. return
  61. }
  62. // 用户存在继续执行
  63. c.Set("userInfo", userInfo)
  64. // token未过期继续执行1其他中间件
  65. c.Next()
  66. }
  67. }